Java

[Java]입력과 출력 -part.4(BufferedReader/BufferedWriter)

MoZZANG 2022. 3. 23. 20:18

우리가 이제껏 입력과 출력포스팅에서는 1byte씩 읽고 출력하거나 한 문자씩 읽어서 한 문자기반으로 출력하는 방법을 알아봤다. 하지만 입력하거나 출력할 데이터가 방대하다면 언제 1byte씩 또는 한 문자씩 읽고 출력하겠는가.

 

Buffered클래스를 사용하면 한번에 512byte씩 읽고 출력한다. 즉 512byte씩 묶어서 보내기 때문에 속도가 훨씬 빨라질 수 있다는 것이다. 우리는 이것을 필터를 끼운다고도 표현한다.

 

 

키보드로부터 입력받아서 모니터로 출력하자. 단, 브릿지 스트림을 통해서 문자단위로 변환하고 필터스트림을 통해 필터링 해보자.

 

키보드는 바이트기반이므로 문자기반의 BufferedReader를 이용해 읽으려면 Reader형 즉, 문자 기반으로 바꿔줘야한다. 따라서 바이트기반입력인 System.in을 InputStreamReader()를 이용해서 문자기반으로 바꾼 후 BufferedReader 변수에 담았다.

 

 

▲ 모니터 출력 또한 바이트기반이다. 따라서 문자기반으로 모니터에 출력하려면 변환과정을 거쳐서 최종적으로 문자기반 클래스인 BufferedWriter형으로 만들어야 한다.

 

 

출력을 해보자

BufferedReader클래스의 메소드 readLine()은 이름에서도 알 수 있듯이 입력스트림에 있는 데이터를 한줄씩 읽어서 String형으로 반환한다. 하지만 입력스트림에 더 이상 읽을 데이터가 없다면 null을 반환하는 특징이 있다. 또한 write()와 다르게 엔터값 즉 \r\n을 읽지않는다.

 

 

 

하지만 BufferedWriter보다는 PrintWriter를 더 많이 사용한다. PrintWriter 객체 생성 시 생성자의 두번째 인자로 true값을 주면 autoflash가 되기 때문이다.

 

또한 BufferdWriter는 줄바꿈을 하려면 \r\n을 추가해주거나 newLine()메소드를 호출해야 하지만 

PrintWriter는 줄바꿈을 지원하는 println(String str)메소드를 제공하기 때문이다.

 

즉 문자 기반으로 입출력시 BufferedReader로 읽고 PrintWriter로 출력하면 편하다.

바로 아래처럼 말이다.

 

 

 

 

 

<키보드 -> 파일>(BufferedReader/PrintWriter사용)>

이번에는 키보드로부터 입력받아서 파일(KeyboardChar.txt)로 출력해보자

단, 키보드로 입력받은 데이터(1byte)는 브릿지 스트림을 통해 문자단위로 변환하자.

그리고 필터스트림을 통해 필터링하자(BufferedReader/PrintWriter필터 스트림 사용)

 

 

▲키보드로부터의 입력은 바이트 기반이므로 문자기반인 BufferedReader를 사용하기 위해서는 문자기반으로 바꿔줘야 한다. 변환을 위해 InputStreamReader를 사용해 문자기반으로 바꿔주었다.

 

 

▲PrintWriter 클래스의 객체 생성시 생성자의 두번째 인자에 true를 주면 autoflash기능이 생긴다. default는 false이다.

 

▲ 위에서 본 코드와 동일한 메커니즘이다. autoflush를 지원하기때문에 flush()메소드를 사용하지 않았고 println()메소드를 통해 줄바꿈이 되기 때문에 newLine()메소드를 사용하지 않았다.

 

 

 

<파일 -> 모니터>(BufferedReader/PrintWriter사용)>

 

 

 

<파일 -> 파일(BufferedReader/PrintWriter사용)>