JavaRush /Java Blog /Random-KO /커피 브레이크 #229. Java에서 파일 및 입출력 작업을 수행하는 방법. Objects 클래스의 유...

커피 브레이크 #229. Java에서 파일 및 입출력 작업을 수행하는 방법. Objects 클래스의 유틸리티 메서드

Random-KO 그룹에 게시되었습니다

Java에서 파일 및 입출력 작업을 수행하는 방법

출처: Medium 이 튜토리얼에서는 Java에서 파일을 생성하고, 읽고, 쓰고, 삭제하는 방법을 설명합니다. 또한 File , InputStreamOutputStream 클래스의 작동 방식도 알아봅니다 . 커피 브레이크 #229.  Java에서 파일 및 입출력 작업을 수행하는 방법.  Objects 클래스의 유틸리티 메소드 - 1

소개

Java에서 파일은 File 클래스로 표시됩니다 . File 클래스는 파일 생성, 읽기, 쓰기 및 삭제를 위한 메서드를 제공합니다. I/O(입/출력)는 프로그램과 파일, 네트워크 소켓 또는 콘솔과 같은 외부 소스 간에 데이터를 전송하는 프로세스입니다. Java는 InputStreamOutputStream 클래스를 포함하여 입출력을 위한 다양한 클래스를 제공합니다 .

파일 생성

파일을 생성하려면 File.createNewFile() 메서드를 사용할 수 있습니다 . 동일한 이름의 파일이 아직 존재하지 않으면 새 파일을 생성합니다. 해당 파일이 이미 존재하는 경우 createNewFile() 메서드는 IOException 을 발생시킵니다 . 다음은 현재 디렉터리에 myfile.txt 라는 새 파일을 만드는 방법에 대한 예입니다 .
File myFile = new File("myfile.txt");
myFile.createNewFile();

파일 읽기

Java에서 파일을 읽으려면 FileInputStream 클래스를 사용할 수 있습니다 . 파일에서 바이트를 읽는 방법을 제공합니다. 파일의 내용을 읽으려면 read() 메서드를 사용해야 합니다 . 이 메서드는 파일에서 1바이트를 읽고 해당 바이트의 값을 반환합니다. 예를 들어, 다음 코드는 myfile.txt 파일의 내용을 읽고 이를 콘솔에 인쇄합니다.
File myFile = new File("myfile.txt");
FileInputStream inputStream = new FileInputStream(myFile);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
    System.out.print(new String(buffer, 0, bytesRead));
}
inputStream.close();

녹음 파일

파일에 쓰려면 FileOutputStream 클래스를 사용할 수 있습니다 . 파일에 바이트를 쓰는 방법을 제공합니다. 문자열의 내용을 파일에 쓰려면 write() 메서드를 사용합니다 . 이 메서드는 지정된 배열의 지정된 바이트 수를 파일에 씁니다. 다음은 "Hello, world!"라는 문자열이 어떻게 작성되는지 보여주는 예입니다. myfile.txt 파일 에 :
File myFile = new File("myfile.txt");
FileOutputStream outputStream = new FileOutputStream(myFile);
byte[] buffer = "Hello, world!".getBytes();
outputStream.write(buffer);
outputStream.close();

파일 삭제

Java에서 파일을 삭제하려면 File.delete() 메서드를 사용해야 합니다 . 삭제하려는 파일이 존재하지 않으면 delete() 메서드는 false 를 반환합니다 . 다음은 myfile.txt 파일을 삭제하는 코드의 예입니다 .
File myFile = new File("myfile.txt");
myFile.delete();

결론

이번 포스팅에서는 파일 및 I/O Java 작업의 기본 사항에 대해 논의했습니다. 파일을 만들고, 읽고, 쓰고, 삭제하는 방법을 배웠습니다. 또한 File 클래스 와 InputStreamOutputStream 클래스 에 대해서도 배웠습니다 .

Objects 클래스의 유틸리티 메소드 - 작업 방법

출처: Inside Java 이 게시물을 통해 Objects 클래스 에서 제공되는 다양한 메서드에 대한 지식을 향상시킬 수 있습니다 . Java의 Objects 클래스 에는 객체에 대한 다양한 작업을 쉽게 수행할 수 있는 많은 유틸리티 메서드가 있습니다. Objects 클래스는 JDK 릴리스에서 여러 가지 업데이트를 거쳤습니다 . JDK 8 및 9에는 매우 중요한 업데이트가 있었고 JDK 16 및 19에는 사소한 업데이트가 있었습니다. Objects 클래스를 사용하는 방법을 살펴보겠습니다 .

사물의 비교

개체는 두 개체의 값을 비교하기 위한 여러 옵션을 제공합니다. Objects 구현을 사용하는 주요 이점은 null 발생 에 대한 안전성입니다 .

같음()

다음은 두 레코드를 비교하는 예입니다.
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime copyOfbilly =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));
nullValue.equals(billy);//NPE
Objects.equals(nullValue, billy);// false
Objects.equals(billy, nicolai);// false
Objects.equals(billy, copyOfbilly);// true

deepEquals()

Objects 클래스 에서는 deepEquals()를 사용하여 두 배열을 비교할 수도 있습니다 . 일반 equals() 와는 달리 배열에 저장된 값을 비교하므로 보다 일관된 결과를 얻을 수 있습니다. 기본적으로 이 메서드는 Arrays.deepEquals() 를 거칩니다 .
record RaceTime(String runnerName, Duration time) {}

RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

RaceTime[] raceTimes1 = new RaceTime[] { billy, nicolai };
RaceTime[] raceTimes2 = new RaceTime[] { billy, nicolai };

Objects.equals(raceTimes1, raceTimes2);// false
Objects.deepEquals(raceTimes1, raceTimes2);// true

비교하다()

Objects에는 두 개의 객체와 하나의 Comparator<T>를 사용할 수 있는 Compare() 메서드 도 있습니다 . Compare() 메서드는 인수 중 하나가 null 이면 허용되는 반환이 없기 때문에 개체 에서 몇 가지 null 안전하지 않은 메서드 중 하나입니다 .
record RaceTime(String runnerName, Duration time) {}
class RaceTimeComparator implements Comparator<RaceTime> {
@Override
public int compare(RaceTime o1, RaceTime o2) {
	return o1.time.compareTo(o2.time);
}
}
RaceTime billy =
new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.compare(billy, nicolai, new RaceTimeComparator());//-1
Objects.compare(null, nicolai, new RaceTimeComparator());//NPE

문자열과 해시코드

Objects 클래스는 객체를 StringHashCode 값으로 변환하는 메서드를 제공합니다 . 다시 말하지만, 이러한 방법의 가장 큰 장점은 null 발생 으로부터 안전하다는 것입니다 .

문자열로 변환

더 흥미로운 방법 중 하나는 오류가 발생할 경우 기본값을 제공하는 toString(obj, nullDefault) 입니다. 이는 toIdentityString(obj)이 전달된 객체의 toString()hashCode()를 마치 이들 메서드 중 어느 것도 덮어쓰지 않은 것처럼 반환한다는 것을 의미합니다.
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.toString(billy);//RaceTime[runnerName=Billy Korando, time=PT1M30S]
Objects.toString(nullValue);//null
Objects.toString(nullValue, "Did not finish");//Did not finish
Objects.toIdentityString(billy);//ObjectsExamples$1RaceTime@251a69d7

해시코드로 변환

개체는 개체를 해당 해시 코드 값으로 변환하는 메서드도 제공합니다.
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
RaceTime billy =
	new RaceTime("Billy Korando", Duration.of(90, ChronoUnit.SECONDS));
RaceTime nicolai =
	new RaceTime("Nicolai Parlog", Duration.of(180, ChronoUnit.SECONDS));

Objects.hashCode(nullValue);//0
Objects.hashCode(billy);//[HashValue]
Objects.hash(billy, nicolai);//[HashValue]

null 확인 중

Objects 클래스는 null 을 확인하고 처리하기 위한 여러 메서드를 제공합니다 .

null에서 NullPointException 발생

requireNonNull(obj) 메소드는 전달된 값이 null 인 경우 NullPointException을 발생시킵니다 .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName);
		time = Objects.requireNonNull(time);
	}
}

사용자에게 메시지와 함께 null에 대한 NullPointException 발생

requireNonNull(obj, String) 메서드는 전달된 값이 null 인 경우 사용자에게 메시지와 함께 NullPointException 오류를 발생시킵니다 .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName, "runner name required!");
		time = Objects.requireNonNull(time, "race time required!");
	}
}

null에 대한 기본값을 반환합니다.

requireNonNullElse(obj, defaultValue) 메소드는 obj가 null 인 경우 전달된 defaultValue를 반환합니다 .
record RaceTime(String runnerName, Duration time) {
	RaceTime{
		runnerName = Objects.requireNonNullElse(runnerName, "John Smith");
		time = Objects.requireNonNullElse(time, Duration.ZERO);
	}
}

공급자 이용

Objects 클래스는 메시지나 기본값을 제공하는 데 사용할 수 있는 requireNonNull(obj, Supply<String>)T requireNonNullElseGet(T, Supply<T>) 메서드 도 제공합니다. 메시지나 기본값을 만드는 것이 성능에 상당한 영향을 미치는 경우에만 사용해야 합니다.
record RaceTime(String runnerName, Duration time) {
static Supplier<String> noNameMsgSupplier = () -> "runner name required!";
static Supplier<String> noTimeMsgSupplier = () -> "race time required!";
	RaceTime{
		runnerName = Objects.requireNonNull(runnerName, noNameMsgSupplier);
		time = Objects.requireNonNull(time, noTimeMsgSupplier);
	}
}
record RaceTime(String runnerName, Duration time) {
static Supplier<String> noNameValueSupplier = () -> "John Smith";
static Supplier<Duration> noTimeValueSupplier = () -> Duration.ZERO;
	RaceTime{
		runnerName = Objects.requireNonNullElseGet(runnerName, noNameValueSupplier);
		time = Objects.requireNonNullElseGet(time, noTimeValueSupplier);
	}
}

예측 널 검사

개체는 다른 시나리오에서도 사용할 수 있지만 조건자에서 사용할 수 있는 null 검사를 제공합니다 .
record RaceTime(String runnerName, Duration time) {}

RaceTime nullValue = null;
Objects.nonNull(nullValue);//false
Objects.isNull(nullValue);//true

인덱스 체크

마지막으로 Objects 클래스는 File , String , Collection 또는 유사한 객체를 탐색할 때 인덱스 위치를 확인하기 위한 여러 옵션을 제공합니다 . 이러한 메서드 중 일부는 최근 JDK 16에 추가되었습니다.
int checkIndex(int index, int length)

int checkFromToIndex(int fromIndex, int toIndex, int length)

int checkFromIndexSize(int fromIndex, int size, int length)

long checkIndex(long index, long length)

long checkFromToIndex(long fromIndex, long toIndex, long length)

long checkFromIndexSize(long fromIndex, long size, long length)
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION