BufferedReader는 Scanner
Bufferedwriter는 System.out.println()
이라고 생각하면 됩니다.
둘은 모두 기존에 쓰던 Scanner와 sout보다 속도 측면에서 훨씬 빠릅니다.
입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 전달되므로 데이터 처리 효율성이 높습니다.
많은 양의 데이터를 처리할 때 유리합니다.
하지만 BufferedReader는 Enter만 경계로 인식하고 받은 데이터가 String으로 고정되기 때문에 입력 받은 데이터를 가공하는 작업이 필요합니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
사용하기 위해서는 추가적인 import가 필요합니다.
Scanner는 int, short, ling, double 다양한 타입을 입력받고 저장할 수 있습니다.
하지만 BufferReader는 String값 밖에 읽지 못합니다.
BufferedWriter는 println처럼 개행 문자를 포함하지 않기 때문에 개행 문을 쓰기 위해 \n을 사용해주거나 newLine() 메서드를 사용해야 합니다.
또한, 이는 버퍼를 사용한 코드이기 때문에 수행이 완료되면 flush()나 close() 메서드를 사용하여 버퍼 사용을 완료했다는 명령을 해야합니다.
System.out.println 호출은 여러 스레드 간의 동기화되어야 합니다. 반면에 bufferedWriter는 동기화가 필요 없으므로 컨텍스트 스위칭 비용을 아낄 수 있다.
따라서 System.out.println는 출력할 때마다 동기화하고 출력
BufferedWriter는 버퍼에 저장된 내용 한번에 출력 (동기화가 필요없음)
import java.io.BufferedReader
import java.io.BufferedWriter
/**
* readInt :문자열 한개 입력 받을 수 있음.
* readList :문자열 여러개를 입력받아 리스트로 저장
*/
private fun BufferedReader.readString() = this.readLine()
private fun BufferedReader.readInt() = this.readLine().toInt()
private fun BufferedReader.readDouble() = this.readLine().toDouble()
private fun BufferedReader.readFloat() = this.readLine().toFloat()
private fun BufferedReader.readListToInt() = this.readLine().split(" ").map{ it.toInt()}
fun main() {
val br = System.`in`.bufferedReader()
/**
* bufferedWriter와 print의 차이점
* print는 출력 할 때마다 동기화가 필요함
* bufferedWriter는 출력할 때 버퍼에 있는 값을 출력하기 때문에 동기화가 필요하지 않음.
*출력을 하는 같은 동작이지만 print는 멀티 스레드 bufferedWriter는 단일 스레드에서 동작하기 때문에
*컨텍스트 스위칭 비용 차이가 발생한다.
*/
val bw = System.out.bufferedWriter()
bw.write("test")
a(br, bw)
b(br, bw)
bw.close()
}
fun a(br: BufferedReader, bw: BufferedWriter) {
bw.flush() // 1
bw.flush() // 2
}
fun b(br: BufferedReader, bw: BufferedWriter) {
bw.flush() // 3
}