java.nio.file
의 File
, Files
, Path
, Paths
Paths
Paths.get(resource.toURI())
는 Path.of(resource.toURI())
와 동일File
vs Files
java.io.File vs java.nio.Files which is the preferred in new code?
java.io.File
의 한계를 극복한 것이 java.nio.File
this.getClass().getClassLoader().getResource()
?this.getClass()
.getClassLoader()
.getResource(fileName);
getClass().getResource()
: 호출 클래스 패키지 기준으로 상대적인 리소스 경로로 탐색
/
로 시작하는 파일명이 들어오면 절대적인 리소스 경로로 탐색한다.getClass().getClassLoader().getResource()
: 호출 클래스 패키지 기준으로 절대적인 리소스 경로로 탐색@Test
void 파일의_내용을_읽는다() throws URISyntaxException, IOException {
final String fileName = "nextstep.txt";
final URL fileUrl = this.getClass()
.getClassLoader()
.getResource(fileName);
final Path path = Paths.get(fileUrl.toURI());
final List<String> actual = Files.readAllLines(path);
assertThat(actual).containsOnly("nextstep");
}
Stream
: 입출력 데이터 통신을 위한 다리 역할
데드락(deadlock)
상태가 된다. 따라서 flush로 해제해주어야 한다.close
하자.
try-catch
대신 try-with-resource
로 자동으로 close하는 것이 좋을 수도read
메서드는 int 값으로 -128 ~ 127 값을 반환하고, Stream의 끝에 도달하면 -1
을 반환한다.@Test
void InputStream은_데이터를_바이트로_읽는다() throws IOException {
byte[] bytes = {-16, -97, -92, -87};
final InputStream inputStream = new ByteArrayInputStream(bytes);
/**
* todo
* inputStream에서 바이트로 반환한 값을 문자열로 어떻게 바꿀까?
*/
final StringBuilder textBuilder = new StringBuilder();
try (Reader reader = new BufferedReader(new InputStreamReader
(inputStream, Charset.forName(StandardCharsets.UTF_8.name())))) {
int c = 0;
while ((c = reader.read()) != -1) {
textBuilder.append((char) c);
}
}
final String actual = textBuilder.toString();
assertThat(actual).isEqualTo("🤩");
assertThat(inputStream.read()).isEqualTo(-1);
inputStream.close();
}
readAllBytes()
로 바이트로 받아온 것을 String으로 만들어주는 방법으로 더 간단하게 가능@Test
void InputStream은_데이터를_바이트로_읽는다() throws IOException {
byte[] bytes = {-16, -97, -92, -87};
final InputStream inputStream = new ByteArrayInputStream(bytes);
/**
* todo
* inputStream에서 바이트로 반환한 값을 문자열로 어떻게 바꿀까?
*/
final String actual = new String(inputStream.readAllBytes());
assertThat(actual).isEqualTo("🤩");
assertThat(inputStream.read()).isEqualTo(-1);
inputStream.close();
}