.txt 파일을 생성하고 여기에 텍스트를 쓰는 방법으로는 일단 다음과 같은 두가지 방법을 알고 있습니다.

1. FileWriter를 이용하여 쓰기

2. BufferedWriter 및 FileWriter를 이용하여 쓰기

3. FileOutputStream 클래스를 이용하여 쓰기


이 중에서 이 글에서는 FileWriter를 이용하여 글을 쓰는 방법을 알아보겠습니다. 


FileWriter 클래스

파일에 문자를 쓰기 위해 활용되는 클래스로 OutputStreamWriter를 상속하고 있습니다. 

FileWriter 클래스만을 활용하여 파일에 내용을 쓰는 경우, FileWriter 객체를 생성하고 그 인자로 File 인스턴스를 담은 뒤에 여기에 내용을 쓰고 flush()를 호출해 주면 됩니다.


다음과 같이 쓸 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
 
public class WriteToFile {
    public static void main(String args[]) {
        
        String message = "This is a sample message.\n";
        
        File file = new File("test1.txt");
        FileWriter writer = null;
        
        try {
            // 기존 파일의 내용에 이어서 쓰려면 true를, 기존 내용을 없애고 새로 쓰려면 false를 지정한다.
            writer = new FileWriter(file, true);
            writer.write(message);
            writer.flush();
            
            System.out.println("DONE");
        } catch(IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(writer != null) writer.close();
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
}
 
cs


그런데, 위의 코드에서처럼 flush() 메소드를 호출하지 않고 실행을 해봐도 여전히 파일에 텍스트 메세지가 쓰여지는 것을 알 수 있었습니다.

그렇다면 이 flush() 메소드는 도대체 뭔가요?


위의 질문에 대한 답을 하기 전에 다른 질문 하나만 던져볼까 합니다. 파일에 내용을 쓰는 것은 입력이라고 할까요, 아니면 출력이라고 할까요?


이 질문에 답하기 위해 확실히 할 점은, 자바 IO에서 말하는 Reader, Writer, InputStream, 그리고 OutputStream의 주체는 바로 컴퓨터 자신이라는 겁니다. 즉,


컴퓨터가 파일을 읽어 들이는 경우에는 입력이 되는 것이고 (read IN, '읽어들임'이라고 이해하면 좀 더 쉬울까요?),

그 반대로 컴퓨터가 파일에 글을 쓰는 경우는 출력이라고 한다는 겁니다 (write OUT, '써서 내보내다'라고 이해하면 나을것 같습니다).


따라서 위의 샘플 코드는 파일에다 글을 쓰는, 즉 출력에 해당하는 작업인 것입니다.


다시 첫번째 질문으로 돌아가 보겠습니다. 컴퓨터가 파일에 내용을 쓰는 경우, 버퍼 (Buffer)라는 개념이 등장합니다. 버퍼는 일종의 완충지대인데요,

컴퓨터 입출력 속도를 높이기 위해 도입된 개념입니다.


모든 출력은 도착 지점으로 바로 나가지 않고 이 버퍼에 먼저 쌓이는데요, 여기서 flush()를 해주어야만 비로소 쌓인 버퍼를 목적지로 내보내게 되는 겁니다.


즉 flush()를 해주지 않으면 목적지에 내용이 도착하지 않을 수 있다는 것입니다. 그렇기 때문에 write() 메소드 호출 후에 꼭 flush()를 하는 것을 잊지 말아야 합니다.


이렇게 텍스트 파일을 생성하고 파일에 텍스트를 쓰는 기능은 나중에 소프트웨어 개발에서 로그 등을 저장할 때 유용하게 쓰일 수 있을거라고 생각됩니다.


반응형

+ Recent posts