빠른 입력을 위한 BufferReader
&
빠른 출력을 위한 BufferedWrier
우리는 지금까지 자바를 배우면서 System.out.println()을 통한 출력, Scaner를 통한 입력을 많이 이용하였는데,
이는 입력 키를 누르는 즉시 프로그램에 연결되는 형태이다.
하지만 코딩테스트 연습을 하거나 사용에 있어서 가끔 입출력 시간이 오래 걸려 개선해야 한다는 에러를 많이 볼 때가 있을텐데,
왜 입력키를 누르는 즉시 프로그램에 연결되는데 오래걸리는걸까?
이는 하드디스크의 속도가 느리고, 외부 장치와 데이터의 입출력도 생각보다 시간이 오래 걸리기 때문이다.
반면 버퍼의 경우에는 버퍼가 가득 차거나, 개행 문자가 나타날 경우 해당 버퍼에 있는 내용을 한 번에 전달하는데,
한 번에 묶어서 보내는 것이 더 효율적이고 빠른 방법이기 때문에 우리는 빠른 입출력을 필요로 할 때에는 버퍼를 이용해야 한다.
[BuffedReader]
- BuffedReader는 개행 문자만 경계로 인식하고 입력받은 데이터가 String으로 고정된다는 특징으로 데이터를 가공해야 하는 경우가 많지만, Scanner보다 속도가 빠르다
* 백준 이라는 코딩테스트 연습 사이트에서 작성된 입력속도 비교표를 확인해보면 BufferedReader는 0.68585초, Scanner는 4.8448초가 소요되며 둘의 시간차이가 생각보다 큰 것을 볼 수 있다.
사용 방법은 아래와 같다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
String str = br.readLine(); // 입력받아 문자열에 저장
1) 사용을 위해 선언을 해야한다.
2) 입력 시에는 .readLine() 메서드를 사용하는데, 위에서 이야기 했던 것 처럼 입력받은 데이터는 String으로 고정되기 때문에 만약 다른 타입을 입력받고 싶은 경우에는 형변환을 하여 사용하면 된다.
3) 예외 처리가 반드시 필요하기 때문에 try/catch문을 이용하거나 throws Exception을 통해 예외처리를 해줘도 된다.
BufferedReader는 개행 문자만 경계로 인식한다고 했는데, 그렇기에 위에서 입력받은 값을 공백 단위로 데이터를 가공하고 싶다면 따로 처리가 필요하다. 입력받은 값이 String이기 때문에 split()을 이용해도 되지만 StringTokenizer를 이용할 수도 있다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
// StringTokenizer 이용
StringTokenizer st = new StringTokenizer(br.readLine()); // 입력받아 문자열에 저장 및 공백 단위로 분리
String str1 = st.nextToken();
String str2 = st.nextToken();
// String.split() 이용
String str = br.readLine();
String strArr[] = str.split(" ");
[BufferedWriter]
- 적은 양의 출력에는 System.out.println()이 편리하고 성능 차이가 없지만 출력해야 하는 데이터의 양이 많을 경우에는 BufferedWriter를 사용하는 것을 권장한다.
사용 방법은 아래와 같다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String str = "안녕하세요?!" // 출력 문자열
bw.write(str); // 출력
bw.flush(); // 버퍼 안의 모든 데이터 출력
bw.close();
1) BufferedWriter에서는 개행을 따로 해주지 않아 만약 필요하다면 .newLine() / "\n"을 이용해 직접 줄바꿈을 해야한다.
2) 버퍼를 1개만 출력할 때에는 writer, 모두 출력할 때에는 flush를 이용해 출력한다
3) 버퍼를 모두 사용했다면 close를 통해 출력 스트림을 닫을 수 있다.
BufferedReader & BufferedWriter 모두 위의 것 이외에도 다양한 함수들도 존재하기 때문에
이는 아래 문서를 참고하기를 바란다.
https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html
BufferedReader (Java Platform SE 8 )
Reads characters into a portion of an array. This method implements the general contract of the corresponding read method of the Reader class. As an additional convenience, it attempts to read as many characters as possible by repeatedly invoking the read
docs.oracle.com
https://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html
BufferedWriter (Java Platform SE 7 )
Writes a portion of an array of characters. Ordinarily this method stores characters from the given array into this stream's buffer, flushing the buffer to the underlying stream as needed. If the requested length is at least as large as the buffer, however
docs.oracle.com
'공부 자료 > 자바[JAVA]' 카테고리의 다른 글
[ JAVA ] ArrayList <> Array (0) | 2024.08.05 |
---|---|
[JAVA] URL을 통해 서버와 통신하는 URLConnection/HttpURLConnection (0) | 2023.11.08 |
[JAVA] URLEncoding이란? URL로 변환하기 위한 URLEncoder 사용 (0) | 2023.11.07 |
[JAVA] StringBuilder란? (0) | 2023.11.07 |
[JAVA] ArrayList 생성자 (0) | 2023.08.30 |