▶BufferedReader 

Java를 처음 접하시는 분들이 주로 받는 입력방식은 Scanner입니다. Scanner를 통해 입력을 받을경우 Space Enter를 모두 경계로 인식하기에 입력받은 데이터를 가공하기 매우 편리합니다. 하지만 그에비해 BufferedReader는 Enter만 경계로 인식하고 받은 데이터가 String으로 고정되기때문에 입력받은 데이터를 가공하는 작업이 필요할경우가 많습니다. Scanner에 비해 다소 사용하기 불편하죠. 하지만 많은 양의 데이터를 입력받을경우 BufferedReader를 통해 입력받는 것이 효율면에서 훨씬 낫습니다. 입력시 Buffer 메모리줌으로써 작업속도 차이가 많이납니다.


BufferedReader 사용법

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int

 선언은 위에 있는 예제와 같이 하시면 됩니다. 입력은 readLine();이라는 메서드를 활용하시면 되는데요. 여기서 주의할점이 두가지가 있습니다. 첫번째는 readLine()시 리턴값을 String으로 고정되기에 String이 아닌 다른타입으로 입력을 받을려면 형변환을 꼭 해주어야한다는 점입니다. 두번째는 예외처리를 꼭 해주어야한다는 점입니다. readLine을 할때마다 try & catch를 활용하여 예외처리를 해주어도 되지만 대개 throws IOException을 통하여 작업합니다.


https://coding-factory.tistory.com/251


안녕하세요

C++에서 자바로 PS 넘어온 코린이인데요.


C++에서 ios::sync 해서 인풋아웃풋에서 시간 줄이는 것처럼 


자바도 문제풀이시 시간 줄여주는 기법중에

더 적당한 자료구조 사용하는 거 말고


인풋아웃풋 신경써줘야 되는 부분은

그냥 BufferedReader랑 BufferedWriter 써주면 만사 ㅇㅋ인가요?


전 StringBuilder가 더 정감있더라구요


감사합니다.. StringBuilder 성능이 문제가 아니라 뭔가 LinkedList를 역순으로 돌면서 성능이 느린거였네요.

-> StringBuilder 누적해서 출력하는 것보다 빠른것 있나요 길이를 알고있다면 간단해 진다.


출력도 sys.out보다 bw.write()하면 출력량 많을때 훨씬 빠르다.



https://www.acmicpc.net/board/view/9744


BufferedReader를 어떻게 사용해야 할지 모르겠습니다.

시간초과 문제 때문에 어쩔 수 없이 

Scanner를 쓰면 안된다는 것까지는 알겠는데요..

BufferedReader를 쓸 때

read()와 readLine() 두 가지를 사용할 수 있는데

둘 다 예제를 그대로 입력창에 복사 붙여넣기 하면

read()는 출력을 안하고 계속 입력상태에 머물고 있고

readLine() 같은 경우는 오류가 나버립니다.



일반적으로 BufferedReader 를 통해 입력받을때 유의하셔야 할 점이 몇가지 있습니다. 

1. 기본적으로 BufferedReader는 한 줄을 통째로 입력받는 방법으로 주로 쓰입니다.

2. readLine() 메서드는 값을 읽어올 때, String값으로 개행문자(엔터값)를 포함해 한줄을 전부 읽어오는 방식입니다.

 - 비슷한 예로 Scanner메서드 중 nextLine()도 스트링 값과 개행문자(엔터값)을 같이 읽어옵니다.(반면 next()는 개행문자는 제외하고 스트링 값만 읽어옵니다.)

 - 예제의 입력 예제를 보면 각 문장이 모두 개행문자(엔터)로 구별되있는것을 확인하실 수 있습니다. 따라서 이 문제에서 개행문자를 입력받는것은 필수입니다!

3. read() 메서드는 값을 읽어올 때, int값으로 변형하여 읽어오는 방식입니다. 

 - 예를들어 input.txt에 저장된 1이라는 숫자를 read()를 통해 읽어오면  int형 숫자 1을 읽어오는 것이 아닌, txt형식으로 저장된 ASCII 형식의 문자값 '1'을 읽어오는 것이므로 결국 int값으론 49를 읽어오는 것이 됩니다. 

 - 이를 해결하려면 int a = br.read() - 48; br.readLine(); 을 하여 ASCII 값에서 뻴셈을 이용한 뒤 엔터 값을 읽어오거나,

 int a = Integer.parseInt(br.readLine()); 를 통해 엔터값을 포함해 한줄을 통째로 입력받은 뒤 해당 스트링값을 int로 형변환 해주는 방법이 있습니다. (저같은 경우에는 주로 후자의 방법을 사용합니다)


flush가 마지막 버퍼 비워주는 거에요?

그래서 버퍼에 남아있는데 아직 출력 안된거 까지 다 출력시켜주는거라고 생각해도 될듯

버퍼드라이터 출력하는게 많을 때에는 시간 엄청 단축되용.


flush는 버퍼에 남은 모든걸 출력이면 남는게 없다고 생각이 확신되면 안써도 되고 close해도됨

굳이 문제 풀때 close안해도 된다.

close하면 flush하고 메모리 해제 해요.

+ Recent posts