Java - 파일에 Text(String)를 쓰는 다양한 방법 및 예제

JS · 30 Apr 2020

Java에서 다음 클래스들을 이용하여 파일에 text를 쓸 수 있습니다.

  • BufferedWriter
  • PrintWriter
  • FileOutputStream
  • Files

예제와 함께 알아보겠습니다.

BufferedWriter를 이용하여 파일 쓰기

다음은 BufferedWriter를 이용하여 text.txt 파일에 text를 쓰는 예제입니다.

File file = new File("/home/mjs/test/text.txt");
String str = "Hello world!";

try {
    BufferedWriter writer = new BufferedWriter(new FileWriter(file));
    writer.write(str);
    writer.close();
} catch (IOException e) {
    e.printStackTrace();
}

파일이 존재하지 않는 경우 파일을 생성하여 text를 입력하고 저장합니다.

중요한 것은 BufferedWriter를 사용했으면 마지막에 close()를 호출하여 FileDescriptor를 닫아줘야 합니다.

만약 아래 코드처럼 Try-with-resources를 사용한다면, try가 마지막에 close()를 호출해주기 때문에 우리가 호출해주지 않아도 됩니다.

File file = new File("/home/mjs/test/text.txt");
String str = "Hello world!";

try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
    writer.write(str);
} catch (IOException e) {
    e.printStackTrace();
}

write()대신에 append()를 사용하여 여러번 text를 입력할 수 있습니다.

File file = new File("/home/mjs/test/text.txt");

try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
    writer.append("Hello~\n");
    writer.append("World!");
} catch (IOException e) {
    e.printStackTrace();
}

PrintWriter를 이용하여 파일 쓰기

다음은 PrintWriter로 파일에 text를 쓰는 예제입니다.

File file = new File("/home/mjs/test/text.txt");
try {
    FileWriter fileWriter = new FileWriter(file);
    PrintWriter printWriter = new PrintWriter(fileWriter);
    printWriter.print("Hello~\n");
    printWriter.print("World!");
    printWriter.close();
} catch (IOException e) {
    e.printStackTrace();
}

print()로 여러번의 text를 입력할 수 있습니다. 이것도 마지막에 꼭 close()를 호출해줘야 합니다.

다음과 같이 Try-with-resources를 사용하여 구현하면 우리가 close()를 호출하지 않아도 됩니다.

File file = new File("/home/mjs/test/text.txt");
try (FileWriter fileWriter = new FileWriter(file)) {
    PrintWriter printWriter = new PrintWriter(fileWriter);
    printWriter.print("Hello~\n");
    printWriter.print("World!");
} catch (IOException e) {
    e.printStackTrace();
}

FileOutputStream을 이용하여 파일 쓰기

다음은 FileOutputStream을 이용하여 text를 파일에 쓰는 예제입니다. String을 byte로 변환하여 Stream에 써야 합니다.

File file = new File("/home/mjs/test/text.txt");
String str = "Hello World";
byte[] bytes = str.getBytes();
try {
    FileOutputStream outputStream = new FileOutputStream(file);
    outputStream.write(bytes);
    outputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

다음과 같이 Try-with-resources를 사용하여 구현할 수도 있습니다.

File file = new File("/home/mjs/test/text.txt");
String str = "Hello World";
byte[] bytes = str.getBytes();
try (FileOutputStream outputStream = new FileOutputStream(file)) {
    outputStream.write(bytes);
} catch (IOException e) {
    e.printStackTrace();
}

Files를 이용하여 파일 쓰기

다음 코드는 Files를 이용하여 파일에 문자열을 쓰는 예제입니다.

String str = "Hello";
byte[] bytes = str.getBytes();
Path path = Paths.get("/home/mjs/test/text.txt");
try {
    Files.write(path, bytes);
} catch (IOException e) {
    e.printStackTrace();
}

String을 byte로 변환하여 write()의 인자로 전달하면 됩니다.

Files.write() 내부에서 OutputStream으로 문자열을 파일에 씁니다. 또한, close()도 호출해주기 때문에 우리가 close()를 호출하지 않아도 됩니다.

참고로, 아래 코드는 Java Files.write()의 실제 구현 코드입니다.

public static Path write(Path path, byte[] bytes, OpenOption... options)
    throws IOException
{
    // ensure bytes is not null before opening file
    Objects.requireNonNull(bytes);

    try (OutputStream out = Files.newOutputStream(path, options)) {
        int len = bytes.length;
        int rem = len;
        while (rem > 0) {
            int n = Math.min(rem, BUFFER_SIZE);
            out.write(bytes, (len-rem), n);
            rem -= n;
        }
    }
    return path;
}

참고