▶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하고 메모리 해제 해요.

자바에서 스트링을 숫자 값으로 변형할 때 Integer.parseInt() vs Integer.valueOf() 이 메소드를 많이 활용하고 있다. 필요할 때마다 적당한 것을 사용했으므로 성능같은 것들을 고려해서 사용해 본적은 없었다. 원시데이터가 필요하면 parseInt() 를 사용했고 객체가 필요하면, valueOf()를 사용했을 뿐이다. 

Integer.parseInt() vs Integer.valueOf() 는 메소드 둘다 String 을 Integer 로 변경하기 위해 사용하는 메소드로 둘다 비슷한 작업을 하지만 약간의 차이가 있다. 

parseInt 와 valueOf 의 차이점

 Integer.parseInt() 와 Integer.valueOf() 의 주요차이점은 아래와 같다. 

parseInt(): 원시데이터인 int 타입을 반환
valueOf(): Integer 래퍼(wrapper)객체를 반환

[출처] Integer.parseInt() vs Integer.valueOf() 차이|작성자 멋진태혁


https://sthwin.blog.me/221000179980



API를 보면.. Integer.valueOf(String)는 String이 Integer.parseInt(String)한거랑 똑같이 해석됩니다. 

그러나, valueOf(String)은 new Integer()으로 객체를 반환하고 parseInt(String)은 int 기본 자료형을 반환합니다.


Integer.valueOf(int)로 어떤 효율적인 코드를 작성하고 싶으시다면 아래같이 눈에 거슬리는 코드를 짜야됩니다. 

Integer k = Integer.valueOf(Integer.parseInt("123"))


결론적으로 문자열을 변환할때 기본 자료형이아닌 객체로 받아오고 싶을때는 valueOf(String)을 쓰시면 되고. 그게 아닐경우는 parseInt(String)을 쓰시면 됩니다.


객체로 받아오고 싶으면 valueOf 그냥 자료형int로 받아오고 싶으면 parseInt

https://hashcode.co.kr/questions/504/%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-parseint%EC%99%80-valueof%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%8A%94-%EB%AD%94%EA%B0%80%EC%9A%94


sb.toString(); -> 이게 가장 쉬운 방법

String.valueOf(sb)를 호출하면 내부적으로 sb.toString()을 호출합니다. sb를 스트링으로 만든다..!!


+ Recent posts