언어, 프레임워크/Java

BufferedReader / BufferedWriter

go_getter 2025. 3. 11. 11:52

입출력 성능을 향상시키기 위해 버터를 사용하는 자바의 입출력 클래스다.

Scanner는 사용자가 입력하는 값을 바로 읽고 출력하지만, Buffer는 입력값 또는 출력값을 모아놨다가 한 번에 처리하는 방식이다.

 

BufferedReader를 사용할 때 예외 처리가 필요하고, 버퍼를 사용해서 입출력할 때 문자열 변환 과정이 필요하다는 단점이 있지만, 한 번에 모아서 데이터를 처리하는 과정에서 입출력 속도를 향상시킬 수 있다.

 


BufferedReader

  • 문자 기반 입력 스트림
    • 입력값이 정수라면 아스키 코드 출력
    • 입력값이 실수라면 NumberFormatException 발생
    • => 문자열로 변환하는 과정 필요
  • read() : 한 문자 단위 읽기 -> 아스키코드로 변환하여 int형으로 반환
  • readLine() : 한 줄 단위 읽기
  • 예외 처리 필요
    • 파일을 read 할 때, 파일이 존재하지 않는 경우 IOException (FileNotFoundException) 발생
    • 네트워크 스트림을 읽을 때, 서버 연결이 끊어지거나 권한 문제가 발생하여 파일을 읽지 못할 때 IOException 발생
    • try-catch 블록으로 적절한 예외 처리 필요함
import java.io.*;

public class BufferedReaderExample {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 콘솔 입력

        System.out.print("입력하세요: ");
        String input = br.readLine();  // 한 줄 입력받기
        System.out.println("입력값: " + input);

        br.close();  // 리소스 해제
    }
}

 


 

BufferedWriter

  • 문자 기반 출력 스트림
    • 문자열 외의 데이터 타입을 출력하려면, 문자열로 변환 후 출력
    • 개행 문자를 포함해서 출력
  • write() : 문자열이 버퍼에 쌓임
    • Buffer가 가득 찼을 때는 write() 실행 시 바로 출력됨
  • newLine() : 줄바꿈(\n)이 버퍼에 쌓임
  • flush() : 버퍼에 쌓여있던 출력
    • close()를 사용하면 자동으로 flush()를 호출
import java.io.*;

public class BufferedWriterExample {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 콘솔 출력

        bw.write("Hello, BufferedWriter!");
        bw.newLine();  // 개행 (== \n)
        bw.write("Java I/O 성능 향상!");
        bw.flush();  // 버퍼 비우기 (출력)

        bw.close();  // 리소스 해제
    }
}

 


 

Buffer 사용 후 close() 하지 않으면 발생하는 문제점