2 분 소요

BufferedReader / Bufferedwriter

BufferedReader 와 Bufferedwriter 클래스는 Java에서 입출력 성능을 향상시키기 위해 사용되는 클래스이다.

이들 클래스는 기본적으로 Reader 및 Writer 클래스를 감싸고 있어서, 버퍼링된 입출력을 제공하여 성능을 최적화 한다.

BufferedReader

문자 기반 입력 스트림에 대한 버퍼링을 제공한다.

특히, readLine() 메서드를 사용하여 한 줄씩 데이터를 읽을 수 있다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
String s = br.readLine();
int i = Integer.parseInt(br.readLine());
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
    public static void main(String[] args) {
        try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

아래는 BufferedReader에서 사용되는 메서드들이다.

read()

int read() throws IOException : 한 문자를 읽어 반환한다. 파일의 끝에 도달하면 -1을 반환한다.

read(char[] cbuf)

int read(char[] cbuf) throws IOException: 문자 배열에 데이터를 읽어 온다.

읽은 문자의 수를 반환하며, 파일의 끝에 도달하면 -1을 반환한다.

readLine()

String readLine() throws IOException: 한 줄의 문자열을 읽어 반환한다.

파일의 끝에 도달하면 null을 반환한다.

skip(long n)

long skip(long n) throws IOException: 입력 스트림에서 n개의 문자를 건너뛴다.

BufferedWriter

문자 기반 출력 스트림에 대한 버퍼링을 제공한다.

특히 write() 메서드를 사용하여 데이터를 버퍼에 쓰고

flush() 메서드를 호출하여 실제 출력 스트림으로 데이터를 내보낼 수 있다.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String str = "abcdef"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedWriterExample {
    public static void main(String[] args) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
            writer.write("Hello, BufferedWriter!");
            writer.newLine();  // 개행 추가
            writer.write("Another line.");
            // writer.flush(); // 실제 출력으로 데이터를 내보내기 위해 flush() 호출 (try-with-resources를 사용하면 자동으로 수행됨)
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

아래는 BufferedWriter에서 사용되는 메서드들이다.

write(int c)

void write(int c) throws IOException: 주어진 정수 c에 해당하는 문자를 출력 스트림에 보낸다.

write(char[] cbuf)

void write(char[] cbuf) throws IOException: 문자 배열 cbuf의 모든 내용을 출력 스트림에 보낸다.

write(String str)

void write(String str) throws IOException: 문자열 str을 출력 스트림에 보낸다.

newLine()

void newLine() throws IOException: 새로운 라인을 출력 스트림에 보낸다.

flush()

void flush() throws IOException: 버퍼의 내용을 출력 스트림에 보낸다.

close()

void close() throws IOException: 출력 스트림을 닫고 사용한 시스템 자원을 해제한다.

Scanner와 차이점

BufferedReader와 Scanner는 둘 다 Java의 입력 스트림을 처리하는 클래스이다.

BufferedReader

특징

  • 버퍼를 이용하여 효율적인 입출력을 지원한다.
  • 문자 단위로 읽어오며, 속도가 빠르다.
  • readLine() 메서드를 이용해 한 줄씩 읽을 수 있다.

장점

  • 대용량 데이터를 효율적으로 처리할 수 있다.
  • 입출력 속도가 빠르며, 문자열을 직접 처리할 때 효과적이다.

단점

  • 기본적으로 다른 자료형을 읽어올 때 형 변환을 해주어야 한다.

사용 시나리오

  • 대용량의 텍스트 데이터를 빠르게 처리해야 할 때
  • 문자열을 직접 처리하는 경우

Scanner

특징

  • 토큰 기반으로 입력을 파싱한다.
  • 다양한 자료형(정수, 실수 등)을 쉽게 읽을 수 있다.
  • 공백이나 개행 문자를 기준으로 입력을 읽는다.

장점

  • 간편하게 다양한 자료형을 읽을 수 있다.
  • 특정 패턴이나 구조가 있는 데이터를 처리할 때 유용하다.

단점

  • 버퍼를 사용하지 않아 입출력 속도가 느릴 수 있다.
  • 대용량 데이터를 처리할 때 효율이 떨어질 수 있다.

사용 시나리오

  • 입력이 간단하고 다양한 자료형을 처리해야 할 때
  • 공백이나 개행 문자를 기준으로 데이터를 읽을 때

정리

Scanner는 사용자 편의성을 강조하며, 간단한 입력 처리에 유용하다.

간단하게 입력을 처리하거나 다양한 자료형을 읽어야 할 때는 Scanner를 사용하는 것이 좋다.

BufferedReader는 성능과 대용량 데이터 처리에 강점이 있다.

다만, 좀 더 복잡한 데이터 파싱이 필요하다.

대용량 데이터 처리 ⇒ BufferedReader가 효율적이다.

간단하고 다양한 자료형 처리 ⇒ Scanner가 간편하다.

입출력 속도가 중요한 경우 ⇒ BufferedReader가 빠르다.

문자열을 직접 처리할 때 ⇒ BufferedReader가 효과적이다.

댓글남기기