Java로 파일에 문자열 저장하기: FileWriter, BufferedWriter 사용법

Yunsung·2025년 1월 2일
post-thumbnail

이 글에서는 Java에서 문자열을 파일에 저장하는 방법에 대해 알아보겠습니다. 여기서는 FileWriterBufferedWriter를 사용하여 파일에 데이터를 저장하는 방법을 알아보겠습니다.


FileWriter와 BufferedWriter의 역할

FileWriter

FileWriter는 파일에 문자를 쓰기 위한 기본적인 클래스입니다. FileWriter는 텍스트 데이터를 파일에 쓸 수 있게 해주며, FileOutputStream을 확장하여 바이트 단위로 파일에 데이터를 쓰는 기능을 제공합니다.

FileWriter writer = new FileWriter("output.txt");
writer.write("Hello, world!");
  • 기능: 파일에 데이터를 직접적으로 쓰는 역할을 합니다. 파일이 없으면 새로 생성되고, 파일이 있으면 기존 파일을 덮어씁니다.
  • 단점: FileWriter는 한 번에 하나의 문자만 쓸 수 있고, 직접적으로 파일에 문자를 쓰기 때문에 I/O 작업의 성능이 좋지 않거나 느릴 수 있습니다.

BufferedWriter

BufferedWriter는 문자 데이터를 버퍼에 쌓아서 한 번에 여러 문자를 효율적으로 쓰는 데 도움을 주는 클래스입니다. BufferedWriter는 내부적으로 버퍼를 사용하여 한 번에 여러 데이터를 파일에 쓸 수 있도록 하여 I/O 작업을 최적화합니다.

BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
writer.write("Hello, world!");
  • 기능: BufferedWriter는 FileWriter와 함께 사용되며, 버퍼링을 통해 성능을 개선합니다. 즉, 데이터를 버퍼에 쌓아 두고, 일정량이 차면 한 번에 파일에 데이터를 씁니다.
  • 장점: 여러 번의 I/O 작업을 한 번의 큰 I/O 작업으로 합치기 때문에 성능이 향상됩니다.

파일에 문자열 저장

다음 코드는 "Happy 2025!!"라는 문자열을 output.txt라는 파일에 저장하는 예시입니다.

public void txtWriter() {
    String msg = "Happy 2025!!";
    File file = null;
    FileWriter writer = null;
    BufferedWriter bw = null;

    try {
        bw = new BufferedWriter(new FileWriter(new File("./output.txt"))); // ./는 현재 파일위치
        bw.write(msg);
        System.out.println("파일저장 완료!!!");
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if(bw != null) {bw.close();}
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

설명

  • BufferedWriterFileWriter를 사용하여 문자열을 파일에 작성합니다.
  • 팡리 저장 완료 후 "파일저장 완료!!!" 메시지를 출력합니다.
  • 예외 처리를 통해 오류를 처리하고, finally 블록에서 리소스를 닫습니다.

🛑리소스를 닫는 이유!!
파일을 읽고 쓰는 작업은 외부 리소스를 사용하므로 작업이 끝난 후 리소스를 닫는 것이 중요합니다.

  • 파일에 데이터가 완전히 저장되지 않을 수 있음: BufferedWriter와 같은 클래스는 내부 버퍼에 데이터를 잠시 저장한 후 한 번에 파일에 씁니다. 만약 리소스를 닫지 않으면 버퍼에 저장된 데이터가 파일에 쓰여지지 않고, 데이터 손실이 발생할 수 있습니다.
  • 리소스 관리: 파일을 열면 시스템 리소스를 차지합니다. 리소스를 닫지 않으면 메모리 누수나 파일 핸들 누수가 발생할 수 있습니다.

파일에서 문자열 읽기

지난 글에서 작성한 BufferedReaderreadLine() 메서드를 사용하여 파일을 한 줄씩 읽어보겠습니다.

public void txtReader() {
    File file = null;
    FileReader reader = null;
    BufferedReader br = null;

    try {
        br = new BufferedReader(new FileReader(new File("c:/testReader.txt")));
        String data = null;
        while((data = br.readLine()) != null) {
            System.out.println(data);
        }
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if(br != null) {br.close();}
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

설명

  • BufferedReaderFileReader를 사용하여 파일에서 데이터를 읽어옵니다.
  • readLine() 메서드를 사용하여 한 줄씩 읽으며, 더 이상 읽을 줄이 없으면 null을 반환합니다.

콘솔 입력을 파일로 저장하기

사용자가 콘솔에서 입력한 데이터를 파일로 저장하는 기능을 구현하는 방법도 알아보겠습니다. BufferedReaderBufferedWriter를 함께 사용하여 콘솔로부터 입력받은 데이터를 파일에 저장합니다.

public void question01() {
    File file = null;
    FileWriter writer = null;
    BufferedWriter bw = null;
    BufferedReader txt = new BufferedReader(new InputStreamReader(System.in));
    String str = null;

    try {
        bw = new BufferedWriter(new FileWriter(new File("./test.txt")));
        while(true) {
            System.out.print("저장할 데이터를 입력하세요: ");
            str = txt.readLine();

            if(str.equals("exit")) {
                System.out.println("종료합니다.");
                break;
            } else {
                bw.write(str); // 입력한 데이터 bw에 넣기
                bw.newLine(); // 줄바꿈
                System.out.println("파일저장 완료!!!");
            }
        }
    } catch(IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if(bw != null) {bw.close();}
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

설명

  • 콘솔에서 데이터를 입력받고 exit입력 시 종료합니다.
  • 입력된 데이터를 BufferedWriter로 파일에 저장합니다.
  • 사용자 입력을 BufferedReader로 받아들이고, BufferedWriter로 파일에 기록합니다.

배열 데이터를 파일에 저장하기

배열에 저장된 객체 정보를 파일에 저장하는 기능을 구현하는 예시입니다. 객체 배열을 순회하며 각 객체의 정보를 파일에 기록합니다.

public void outputObjectFile() {
    PersonVO[] ary = new PersonVO[10];
    StudentVO stu = new StudentVO("하츄핑", 20, "서울", "2000");
    TeacherVO tea = new TeacherVO("아자핑", 35, "서울", "자바");
    EmployeeVO emp = new EmployeeVO("차차핑", 38, "서울", "교육운영팀");
    ary[0] = stu;
    ary[1] = tea;
    ary[2] = emp;
    File file = null;
    FileWriter writer = null;
    BufferedWriter bw = null;

    try {
        file = new File("./instance.txt");
        writer = new FileWriter(file);
        bw = new BufferedWriter(writer);

        for(int i = 0; i < ary.length; i++) {
            if(ary[i] != null) {
                String data = ary[i].info();
                System.out.println(data);
                bw.write(data + "\n");
                bw.flush(); // 파일에 데이터가 누락되는 상황을 방지
                System.out.println("파일에 저장완료!!");
            }
        }
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if(bw != null) {bw.close();}
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

설명

  • 객체 배열을 순회하며 각 객체의 info() 메서드를 호출하여 정보를 파일에 저장합니다.
  • BufferedWriter로 파일에 데이터를 기록하고, flush()를 사용하여 즉시 저장되도록 합니다.

파일로 저장된 데이터 불러오기

파일에 저장된 데이터를 프로그램 실행 시 불러오는 방법을 살펴보겠습니다. BufferedReader를 사용하여 파일을 읽고, 데이터를 객체로 변환하여 배열에 저장합니다.

public boolean loadToFile() {
    boolean flag = false;
    File file = null;
    FileReader reader = null;
    BufferedReader br = null;
    PersonVO[] per = new PersonVO[10];
    int i = 0;

    try {
        br = new BufferedReader(new FileReader(new File("./Object.txt")));
        String data = null;
        while((data = br.readLine()) != null) {
            String[] strAry = data.split("-");
            if(strAry[i] != null) {
                String name = strAry[++i];
                int age = Integer.parseInt(strAry[++i]);
                String address = strAry[++i];
                String common = strAry[++i];
                i -= 4;
                if(strAry[i].equals("stu")) {
                    per[i] = new StudentVO(name, age, address, common);
                }
                if(strAry[i].equals("tea")) {
                    per[i] = new TeacherVO(name, age, address, common);
                }
                if(strAry[i].equals("emp")) {
                    per[i] = new EmployeeVO(name, age, address, common);
                }
                setAry(per[i]);
            }
            flag = true;
        }
    } catch(Exception e) {
        e.printStackTrace();
        flag = false;
    } finally {
        try {
            if(br != null) {br.close();}
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    return flag;
}

설명

  • 파일에서 데이터를 읽어오고, 해당 데이터를 객체로 변환하여 배열에 저장합니다.
  • 각 객체 유형을 확인하여 StudentVO, TeacherVO, EmployeeVO 등으로 적절하게 변환합니다.
profile
풀스택 개발자로서의 도전을 하는 중입니다. 많은 응원 부탁드립니다!!😁

0개의 댓글