본문 바로가기
나만의 정리

스트림 정리

by 코리늬 2018. 5. 21.

어김없이 알고리즘 문제를 공부하다가 BufferedReader와 BufferedWriter를 사용해서 출력하라는 문제에서 막혔다.

뭐였더라..


종류에는 Writer, BufferedWriter, OutputStreamWriter,  BufferedOutputStream // Reader, BufferedReader, InputStreamReader, BufferedInputStream가 있다.


  • Writer는 기본 스트림 단위로 즉각즉각 스트림을 하기 때문에 성능의 저하가 일어날 수 있다.
  • BufferedWriter도 기본 스트림 단위로 스트림을 하지만 "시스템 버퍼를" 사용해 읽어 들이기 때문에 저하가 덜 일어난다.

즉, 기본 스트림 : 파일로부터 직접 스트림

    버퍼 스트림 : 시스템 버퍼를 이용해 스트림

(Input,OutputStream은 아래에서 정리하겠다.)


- BufferedReader

  •   Reader에서는 read메소드만 제공되지만 BufferedReader는 readLine메소드를 제공해 문장단위로 읽어들일 수 있다.

Reader만 사용하면 한 문장으로 불러오는 것이 불가능하기 때문에 한 글자씩 불러와 char형 배열에 저장해야 한다.


- BufferedWriter

  • BufferedWriter는 Writer와 거의 유사하지만, newLine이라는 개행메소드(키보드 엔터)를 제공해준다.

- BufferedInputStream과 BufferedOutputStream

  • BufferedInputStream과 BufferedOutputStream은 기존의 InputStream과 OutputStream에 비해서 성능이 좋다.

- InputStreamReader와 OutputStreamWriter

  • InputStreamReader : 바이트 스트림을 문자 스트림으로
  • OutputStreamWriter : 문자 스트림을 바이트 스트림으로 변환하는 스트림이다.

* 대체적으로 스트림 앞에 Buffered가 들어가면 성능이 좋은 것 같다.


- 버퍼의 한계, flush

  • 버퍼에는 한계가 있다.
  • 버퍼 데이터가 축적되는 가정에서 프로그램이 예기치 못하게 꺼진다면? 
-> 버퍼가 비워지지 못해 데이터가 전해지지 않고 그대로 데이터는 유실된다.
  • 그래서 이 점을 커버하기위해 flush라는 메소드를 지원한다.
  • flush는 버퍼를 비우는 기능을 한다.
  • 기본적으로 스트림이 종료(close)되면 자동으로 flush가 작동하긴 하지만 버퍼를 이용하는 클래스의 경우 한계점을 극복하기 위해 flush를 더 잘 사용해야 한다.
  • 중요한 데이터를 저장하는 구문 뒤에는 flush를 써줘야 한다.


- 실 사용 예시)

  • java에서 입력을 받을 때 보통 Scanner를 이용한다. 테스트 케이스의 수가 적을 때는 문제가 되지 않지만 수가 커질수록 Scanner로 입력받는데 한계가 있다.
  • 따라서 BufferedReader를 사용한다.
- 사용방법

  • 데이터를 readLine()함수를 이용해서 읽을 경우 리턴값은 String을 가지게 된다. 그래서 parseInt()함수를 사용해 형 변환을 해준다.
  • 또한 Scanner의 경우 nextInt를 입력하면 공백 다음 숫자를 받아주기 때문에 어려움 없이 사용할 수 있었지만, BufferedReader를 사용할 경우 다른 방식을 취해야한다.
  • 바로 StringTokenizer를 이용한 방식이다.


- 알아두면 좋은 점!!
  • 일반적으로 자바에서 출력을 할 때 System.out.println() 함수를 많이 사용한다. 이 부분 또한 테스트 케이스가 작을 때는 크게 속도차이가 나지 않지만 테스트 케이스가 커지면 얘기가 달라지기 때문에 알고리즘 문제를 풀 때에는 BufferedWriter를 사용하는게 좋다고 한다.
- 사용방법

  • System.out.println의 경우에는 자동 줄바꿈을 해주지만, bw.write를 사용할 경우 줄바꿈을 위해 \n으로 처리해줘야 한다.
  • 유의할 점은 flush()함수나 close()함수를 사용하지 않을 경우 제대로 출력되지 않을 수 있다.


댓글