우리가 이제껏 입력과 출력포스팅에서는 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사용)>
'Java' 카테고리의 다른 글
[Java]입력과 출력 -part.6(Data InOutStream) (0) | 2022.03.27 |
---|---|
[Java]입력과 출력 -part.5(Buffered InOut) (0) | 2022.03.23 |
[Java]입력과 출력 -part.3(File -> Monitor, File) (0) | 2022.03.23 |
[Java]입력과 출력 -part.2(bridge stream) (0) | 2022.03.23 |
[Java]입력과 출력(Input and Output) - part.1 Basic (0) | 2022.03.23 |