Scanner보다 빠른 입출력 BufferedReader, BufferedWriter
버퍼를 통해서 입출력을 전달해준다.
BufferedReader, BufferedWriter가 Scanner보다 더 효율이 좋은 이유는 버퍼를 이용해서 그렇다고한다.
누를때마다 정보를 이동시키는것보다는 중간에 메모리 버퍼를 둬서 데이터를 묶어서 전송시키는것이 효율적이고 빠르다고 한다. 흙을 퍼 나를때 삽으로 한번뜨고 옮기는것보다는 수레에 한번에 담아서 옮기는것이 더 효율적이고 빠른것처럼.
IOException
BufferedReader나 BufferedWriter의 메소드를 사용하려면
사용할곳에서 try catch를 두르거나
해당 클래스의 throws IOException처리를 해줘야한다.
public static void main(String[] args)throws IOException {
BufferedReader
BufferdReader는 엔터(개행문자)로 입력값을 구분한다. ( 공백,스페이스값으로 구분안함)
그리고 받은 데이터는 String으로만 저장되므로 받은 데이터를 사용하려면 형변환을 해야한다.
Integer.parseInt라던지, 공백문자 기준으로 구분하려면 Stringtokenizer를 이용한다던지
사용예시
int a = Integer.parseInt(br.readLine()); // 다음과 같이 인트형으로 형변환해서 저장
StringTokenizer st = new StringTokenizer(br.readLine()); // Stringtokenizer에 String값 저장해서 공백기준으로 데이터를 처리가능
while (st.hasMoreTokens()) {
bw.write(st.nextToken()+"\n"); // 이렇게 하나씩 토큰을 받아서 처리 , write에는 개행이 없으므로 개행문자를 추가해준다.
}
readLine()
개행문자가 나오기까지 한줄을 받아주는 메소드
read()
입력된값중 맨 앞의 하나만 읽어서 정수형으로 반환해준다.
abcd로 입력했을때 맨앞 a를 'a'로 읽고 '3'의 정수형인 51(아스키코드) 로 반환해준다.
반환값 => int
int temp = br.read();
bw.write(temp);
bw.newLine(); // 개행 메소드를 사용해도된다.
결과해석:
a를 입력해서 65가 temp에 저장되고 bw.write()에 인트값을 넣으면 해당 인트값의 아스키코드문자를 출력해준다.
BufferdWriter
버퍼를 사용해서 출력하는것이기 때문에 다 사용후에는
꼭 bw.flush -> bw.close 메소드들 순서대로 사용해줘야한다. 그렇지않으면 출력결과가 나타나지않는다.
flush()
스트림을 비운다. -> 이게 나오기전까지는 버퍼에 쌓아두고있다가 flush()가 나오면 한번에 출력됨 ( Stringbuilder같은 느낌)
close()
스트림을 닫는다. 닫기전에 flush 해줘야함.
bw.write()
이 메소드는 개행을 해주지않기때문에 개행문자를 같이 사용하거나 개행메소드를 사용하면된다.
개행메소드 -> bw.newLine()
write()의 전달인자로는
int형 -> 해당 인트값을 아스키코드값으로 인식하여 하나의 문자를 출력해준다.
ex ) bw.write(65) 를 했을시 A가 출력됨.
bw.write(65);
bw.newLine(); // 개행 메소드를 사용해도된다.
int값을 그냥 그대로 출력하고싶다면 뒤에 +" " 또는 + "\n"를 추가해주자.
-> 문자열과 + 연산으로 전체를 문자열로 바꿔주는것
bw.write(2 + "");
bw.write(2+"\n");
String -> 그대로 출력됨.
전체 사용예시
public class prac {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args)throws IOException {
int a = Integer.parseInt(br.readLine()); // 다음과 같이 인트형으로 형변환해서 저장
StringTokenizer st = new StringTokenizer(br.readLine()); // Stringtokenizer에 String값 저장해서 공백기준으로 데이터를 처리가능
while (st.hasMoreTokens()) {
bw.write(st.nextToken()+"\n"); // 이렇게 하나씩 토큰을 받아서 처리 , write에는 개행이 없으므로 개행문자를 추가해준다.
}
bw.write(65);
bw.newLine(); // 개행 메소드를 사용해도된다.
bw.flush();
bw.close();
}
}
출처, 더 자세한내용
'자바 > ++' 카테고리의 다른 글
[Java] Split 메소드 문자열 자르기 (0) | 2022.12.03 |
---|---|
Collections.sort() 와 Arrays.sort() 시간복잡도, 사용법 (0) | 2022.12.03 |
자바 StringTokenizer 문자열분리,문자열구분! + split [미완] (0) | 2022.10.29 |
자바 1차원 배열,2차원 배열 출력하기 Arrays.toString(),Arrays.deepToString() (1) | 2022.10.28 |
char형 변수 null 체크할때 (0) | 2022.10.28 |
댓글