코드 저장소

공부에는 끝이 없다!

JAVA/입출력

BufferedWriter - 출력을 보다 빠르게!

VarcharC2K 2023. 8. 9. 11:56

코딩 테스트를 진행하다 입출력 관련 처리를 가장 먼저 하게 된다.

초기에는 Scanner를 이용하여 입출력을 처리하였지만, 속도 면에서 BufferedReader가 훨씬 빠른 처리가 가능한 것을 배우고 난 후로는 입력은 BufferedReader를 이용하여 처리하였다.

그럼 System.out.println()를 대체할 수 있는 방법은 없는가?

이번에는 출력을 대신하여 주는 BufferedWriter에 대하여 알아보자

 

우선 BufferedWriter는 Reader와 같이 java.io 패키지에 포함된 클래스 이다.

BufferedWirter에 대하여 chatGPT에 질의해 보았다.

 

BufferedWriter는 Java에서 텍스트 데이터를 파일에 쓰는 데 사용되는 클래스입니다. BufferedWriter는 출력 스트림을 이용하여 데이터를 버퍼에 저장한 후, 효율적으로 파일에 쓸 수 있는 기능을 제공합니다. 이를 통해 파일에 쓰기 작업의 성능을 향상시킬 수 있습니다.
BufferedWriter 클래스는 java.io 패키지에 속해 있습니다. 아래는 BufferedWriter의 주요 생성자와 메서드입니다:
생성자:
  • BufferedWriter(Writer out): 지정된 출력 스트림을 이용하여 BufferedWriter 객체를 생성합니다.
주요 메서드:
  • void write(String str): 지정된 문자열을 버퍼에 씁니다.
  • void newLine(): 새로운 줄을 생성하고 버퍼에 씁니다.
  • void flush(): 버퍼의 내용을 출력 스트림에 씁니다.
  • void close(): 스트림을 닫습니다.
아래는 BufferedWriter를 사용하여 텍스트 파일에 데이터를 쓰는 예제 코드입니다:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
    public static void main(String[] args) {
        // 대상 파일 경로
        String filePath = "output.txt";

        try {
            // BufferedWriter를 사용하여 파일에 문자열 출력
            BufferedWriter bw = new BufferedWriter(new FileWriter(filePath));

            // 문자열 출력
            bw.write("Hello, BufferedWriter!");
            bw.newLine(); // 새로운 줄 생성
            bw.write("This is an example of BufferedWriter.");

            // BufferedWriter 닫기
            bw.close();

            System.out.println("파일에 문자열 출력이 완료되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
위 코드에서 BufferedWriter를 사용하여 텍스트 파일에 데이터를 쓰고 있습니다. write() 메서드를 사용하여 데이터를 버퍼에 쓴 후, newLine() 메서드로 새로운 줄을 생성하여 줄바꿈을 수행합니다. 마지막으로 try-with-resources 구문을 활용하여 BufferedWriter를 안전하게 닫습니다.
BufferedWriter는 작성할 데이터를 먼저 버퍼에 저장하고, 필요할 때 한 번에 출력 스트림으로 전송함으로써 파일 쓰기 성능을 향상시키는 역할을 수행합니다.

위의 예시는 특정 파일 위치에 해당 텍스트를 출력하는 방법이고, println처럼 사용을 하려면 선언자의 FileWriter를 OutputStreamWriter로 바꾸어서 System.out을 인자로 받도록 바꿔주면 된다.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

위의 코드와 같이 선언하고 bw.write() 메서드에 출력할 문자열을 넣어주면 System.out.println처럼 콘솔창에 출력을 진행하게 된다.

 

다만, 주의해야할 부분이 있는데...

우선 BuffedWriter는 BufferedReader와 똑같이 반드시 try/catch문이나 throws로 IOException을 잡아주어야한다.

만일 해당 처리를 하지 않으면 에러가 발생하게 된다.

 

또, bw.write();는 문자열을 사용하는 메서드 이므로, System.out.println()에서 사용하듯이, int를 바로 넣으면 문제가 생길 수 있다. 예를 들어서, 내가 65라는 숫자를 출력하고 싶어 다음과 같이 코드를 구성하였다.

 public static void main(String[] args) {
        try {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            
            int asciiValue = 65; // 'A'의 아스키 코드 값
            bw.write(asciiValue);
            
            bw.flush();
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

이때 bw.wirte();를 통하여 출력되는 값은 65가 아닌 'A'가 출력되게 된다. 65라는 int 값은 대문자 'A'에 해당하는 아스키 코드 값이기 때문에 문자열로 변환되어 출력되는 것!

따라서, 65를 출력하기 위해선 문자열에 들어갈때, 미리 toString 메서드를 이용하여 문자열로 값을 넣어주어야 한다.

public static void main(String[] args) {
        try {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

            int asciiValue = 65; // 'A'의 아스키 코드 값
            bw.write(Integer.toString(asciiValue)); // 아스키 코드 값을 문자열로 변환하여 출력
            
            bw.flush();
            bw.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

위와 같이 문자열로 변환하여야 정상적으로 출력되는 것을 확인 할 수 있다.

 

마지막으로, write()메서드만 사용한다고 콘솔에 출력이 되는것이 아니고, 반드시 flush()를 통하여 버퍼를 비워내 주어야 출력이 진행된다. 즉, write() 메서드는 출력할 문자열을 담기만 하고 실제 출력은 flush()에서 진행하는 것!

 

또한, 위의 예제에서 볼수 있듯이 자동으로 개행이 되는것이 아니므로, 개행이 필요한 경우, newLine() 메서드를 통하여 개행을 따로 해주어야 한다.

 

'JAVA > 입출력' 카테고리의 다른 글

문자열 관리 - StringTokenizer와 Split() 메서드  (0) 2023.08.08