본문 바로가기

JAVA

BufferedReader, BufferedWriter

Scanner와 Syetem.out.print 로도 입출력은 할 수 있지만,
왜 대부분의 알고리즘 풀이에서 BufferedReader/Writer 를 사용하는 것일까?

결론

  입력 출력
    Scanner   BufferedReader   System.out.print   BufferedWriter
장점   구분자를 설정할 수 있다.
  (띄어쓰기 or 엔터)
  입력받는 데이터의 형식을
  설정할 수 있다.
  (next~~를 통해)
  Scanner 보다
  성능이 좋다.
  뒤에 ln을 붙여 자동으로
  줄바꿈을 해줄 수 있다.
  System.out.print보다
  성능이 좋다
단점   BufferedReader보다
  성능이 안 좋다.
  구분자가 오직 enter이다.
  입력받는 데이터가
  String으로 고정되어있다.
  위 특성 때문에 데이터를
  가공할 필요가 있다.
  BufferedWriter보다
  성능이 안 좋다.
  자동 줄바꿈이 없기 때문에
  "\n"을 넣어줘야 한다.

=> Scanner, System.out.print보다 번거롭지만, 성능이 좋기 때문에 BufferedReader/Writer을 사용한다.

 

BufferedReader 사용 방법

import java.io.*;

// BufferedReader 생성 방법
InputStream in = System.in;
InoutStreamReader reader = new InputStreamReader(in);
BufferedReader br = new BufferedReader(reader);

// 최종 - 위 세줄 축약 버전
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

// readLine - 기본적으로 String으로 읽어오도록 설정되어있음
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int

풀이 ))
① InputStream in = System.in;
System.in(시스템 표준 입력) 즉, 키보드를 in과 연결시킨다는 뜻이다.
in.read( )로도 값을 읽어올 수는 있지만, 하나씩 받아오거나 read(byte[ ]) 에서
매개변수로 주는 배열의 길이만큼만 받아오므로 고정된 값을 받아올 수 밖에 없다.
고정된 값을 받아온다는 것은 사용하지 않는 공간은 낭비가 되는 것이고, 넘치는 값은 한번에 담지 못하는 문제가 발생한다.
② InputStreamReader reader = new InputStreamReader(in);
콘솔에서 입력받을 때 byte기반이 아니라 char기반으로 입력받는게 좋으므로
바이트 기반 스트림을 문자 변환 보조 스트림인 InputSreamReader과 연결시켜준다.
또 이를 사용하는 다른 이유는, BufferedReader 클래스의 생성자에서 직접 System.in과 같은
InputStream을 매개값으로 받을 수 없으므로 InputStreamReader를 '이용'하는 것이다.
③ BufferedReader br = new BufferedReader(reader);
앞에 나온 InputStream.read(byte[ ])이나 InputStreamReader(char[ ]) 처럼 배열을 이용하지 않고
가변적으로 문자열을 입력받을 수 있다.
BufferedReader는 readLine( )을 통해 한줄씩 문자열을 읽어오며,
자동으로 모든 입력을 String으로 받기 때문에 이후 형변환이 필요할 수 있다.

⭐I/O를 하기 위해선 무조건 try-catch로 IOExction 잡아줘야 한다⭐

 

BufferedWriter 사용 방법

BufferedWriter의 사용 방법, 원리도 위와 동일하다.
위에서 InputStream(System.in), InputStreamReader, BufferedReader 세가지 클래스로 
BufferedReader 객체를 만드는 과정을 설명했으니 여기에서는 자세한 설명은 생략한다.

import java.io.*;

// BufferedWriter 생성 방법
OutputStream os = System.out;
OutputStreamWriter osr = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osr);

// 최종 - 위 세줄 축약 버전
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

 

실습 - BufferedReader, BufferedWriter 사용 예시

package honja_silsub;

import java.io.*;

public class BufferedReaderAndWriterExample {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		bw.write("숫자를 입력하세요 : ");
		
		int n = Integer.parseInt(br.readLine());
		br.close(); // 입력 스트림 close
		
		bw.write("입력한 숫자는 "+n+"입니다.");
		bw.newLine(); // 줄 바꿈 메소드
		bw.flush(); // 버퍼에 있는 것 스트림으로 보내기
		bw.close(); // 출력 스트림 close
	}
}

 

실습 - System.out 과 BufferedWriter 시간 비교

약 18배정도 속도가 빠르다

 

참고

Java - 자바 기본 입 출력/ System.in.read(); 에 대하여 - kobalja_Code_Vlog (tistory.com)

[Java 자바 입출력] BufferedReader/BufferedWriter (tistory.com)