1. 개요
이 빠른 사용방법(예제)에서는 여러 가지 방법으로 문자열 List 을 Java의 텍스트 파일에 작성합니다. 먼저 FileWriter , BufferedWriter , 마지막으로 Files.writeString 에 대해 설명 합니다.
2. FileWriter 사용
java.io 패키지에는 문자 데이터를 파일에 쓰는 데 사용할 수 있는 FileWriter 클래스가 포함 되어 있습니다. 계층 구조를 보면 FileWriter 클래스가 OutputStreamWriter 클래스를 확장하고 다시 Writer 클래스를 확장하는 것을 볼 수 있습니다.
FileWriter 를 초기화하는 데 사용할 수 있는 생성자를 살펴보겠습니다 .
FileWriter f = new FileWriter(File file);
FileWriter f = new FileWriter(File file, boolean append);
FileWriter f = new FileWriter(FileDescriptor fd);
FileWriter f = new FileWriter(File file, Charset charset);
FileWriter f = new FileWriter(File file, Charset charset, boolean append);
FileWriter f = new FileWriter(String fileName);
FileWriter f = new FileWriter(String fileName, Boolean append);
FileWriter f = new FileWriter(String fileName, Charset charset);
FileWriter f = new FileWriter(String fileName, Charset charset, boolean append);
FileWriter 클래스 의 모든 생성자는 기본 바이트 버퍼 크기와 기본 문자 인코딩이 허용된다고 가정합니다.
이제 FileWriter 를 사용하여 문자열 List 을 텍스트 파일 에 쓰는 방법을 알아보겠습니다 .
FileWriter fileWriter = new FileWriter(TEXT_FILENAME);
for (String str : stringList) {
fileWriter.write(str + System.lineSeparator());
}
fileWriter.close();
return TEXT_FILENAME;
예제에서 주목해야 할 한 가지 중요한 점은 FileWriter 가 sampleTextFile.txt 가 아직 없는 경우 이를 생성한다는 것입니다 . 파일이 존재하면 생성자의 선택에 따라 파일을 덮어쓰거나 추가할 수 있습니다.
3. BufferedWriter 사용
java.io 패키지에는 더 나은 성능으로 문자 데이터를 쓰기 위해 다른 작성기와 함께 사용할 수 있는 BufferedWriter 클래스 가 포함 되어 있습니다. 그러나 어떻게 더 효율적입니까?
BufferedWriter 를 사용 하면 문자가 디스크 대신 버퍼에 기록됩니다. 버퍼가 가득 차면 모든 데이터가 한 번에 디스크에 기록되어 디스크에서 송수신되는 트래픽이 줄어들어 성능 향상에 기여합니다.
계층 구조에 대해 이야기하면 BufferedWriter 클래스가 Writer 클래스를 확장합니다 .
BufferedWriter 를 초기화하는 데 사용할 수 있는 생성자를 살펴보겠습니다 .
BufferedWriter b = new BufferedWriter(Writer w);
BufferedWriter b = new BufferedWriter(Writer w, int size);
버퍼 크기를 지정하지 않으면 기본값을 사용합니다.
이제 BufferedWriter 를 사용하여 문자열 List 을 텍스트 파일 에 쓰는 방법을 살펴보겠습니다 .
BufferedWriter br = new BufferedWriter(new FileWriter(TEXT_FILENAME));
for (String str : stringList) {
br.write(str + System.lineSeparator());
}
br.close();
return TEXT_FILENAME;
위의 코드에서 FileWriter 를 BufferedWriter로 래핑 하여 읽기 호출을 줄이고 결과적으로 성능을 향상시켰습니다.
3. Files.writeString 사용
java.nio 패키지에는 파일 에 문자를 쓰기 위한 Files 클래스 의 writeString() 메서드가 포함되어 있습니다. 이 방법은 Java 11에서 도입되었습니다.
java.nio.file.Files 에서 사용할 수 있는 두 가지 오버로드된 메서드를 살펴보겠습니다 .
public static Path writeString(Path path, CharSequence csq, OpenOption… options) throws IOException
public static Path writeString(Path path, CharSequence csq, Charset cs, OpenOption… options) throws IOException
첫 번째 방법에서는 Charset 을 지정할 필요가 없습니다 . 기본적으로 UTF-8 Charset 을 사용하지만 두 번째 방법에서는 Charset 을 지정할 수 있습니다 . 마지막으로 Files.writeString 을 사용하여 문자열 List 을 텍스트 파일 에 쓰는 방법을 알아보겠습니다 .
Path filePath = Paths.get(TEXT_FILENAME);
Files.deleteIfExists(filePath);
Files.createFile(filePath);
for (String str : stringList) {
Files.writeString(filePath, str + System.lineSeparator(),
StandardOpenOption.APPEND);
}
return filePath.toString();
위의 예제에서는 이미 존재하는 파일을 삭제한 다음 Files.createFile 메서드 를 사용하여 파일을 생성했습니다 . OpenOption 필드를 StandardOperation.APPEND로 설정 했습니다. 즉, 파일이 추가 모드에서 열립니다. OpenOption을 지정하지 않으면 두 가지 일이 발생할 것으로 예상할 수 있습니다.
- 파일이 이미 있으면 덮어씁니다.
- File.writeString 은 새 파일을 만들고 파일이 존재하지 않는 경우 씁니다.
4. 테스트
JUnit 테스트 의 경우 문자열 List 을 정의해 보겠습니다 .
private static final List<String> stringList = Arrays.asList("Hello", "World");
여기에서 NIO Files.lines 및 count() 를 사용하여 출력 파일의 라인 수를 알아봅니다 . 개수 는 List 의 문자열 수와 같아야 합니다 .
이제 FileWriter 구현을 테스트해 보겠습니다.
@Test
public void givenUsingFileWriter_whenStringList_thenGetTextFile() throws IOException {
String fileName = FileWriterExample.generateFileFromStringList(stringList);
long count = Files.lines(Paths.get(fileName)).count();
assertTrue("No. of lines in file should be equal to no. of Strings in List", ((int) count) == stringList.size());
}
다음으로 BufferedWriter 구현을 테스트합니다.
@Test
public void givenUsingBufferedWriter_whenStringList_thenGetTextFile() throws IOException {
String fileName = BufferedWriterExample.generateFileFromStringList(stringList);
long count = Files.lines(Paths.get(fileName)).count();
assertTrue("No. of lines in file should be equal to no. of Strings in List", ((int) count) == stringList.size());
}
마지막으로 Files.writeString 구현을 테스트해 보겠습니다.
@Test
public void givenUsingFileWriteString_whenStringList_thenGetTextFile() throws IOException {
String fileName = FileWriteStringExample.generateFileFromStringList(stringList);
long count = Files.lines(Paths.get(fileName)).count();
assertTrue("No. of lines in file should be equal to no. of Strings in List", ((int) count) == stringList.size());
}
5. 결론
이 기사에서는 문자열 List 을 텍스트 파일에 작성하는 세 가지 일반적인 방법을 살펴보았습니다. 또한 JUnit 테스트를 작성하여 구현을 테스트했습니다.
항상 그렇듯이 사용방법(예제)의 전체 코드는 GitHub에서 사용할 수 있습니다 .