-
[JAVA] BufferedReader와 BufferedWriter 사용법프로그래밍 언어/JAVA 2023. 5. 25. 10:41
https://www.acmicpc.net/problem/15552
백준 15552번에 보면 아래와 같은 설명이 있다. 앞선 문제를 풀면서 Scanner 대신 BufferedReader를 많은 사람들이 사용하고 있기에 BufferedReader의 개념을 익히고 사용할 수 있었다.
본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다. Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.
그러나 출력에 대해선 System.out.println() 을 사용하고 있었다. 출력도 BufferedWriter를 사용하면 더 빠른 시간안에 값을 출력할 수 있다는 걸 알게 되었다. 그럼 그 개념에 대해 알아보자.
https://wonisdaily.tistory.com/193
이전에 간단하게 정리한 적이 있다. 이번 포스팅에선 더 자세히 적으려고한다.
BufferedReader와 BufferedWriter는 버퍼를 사용하여 읽기와 쓰기를 하는 함수이다. 버퍼를 사용하지 않은 입력은, 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달된다. 반면 버퍼를 사용하는 입력은, 키보드의 입력이 있을 때마다 한 문자씩 버퍼로 전송한다. 버퍼가 가득 차거나 혹은 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다.
쓰레기통을 비우는 일이라고 생각하면 이해가 쉽다. 쓰레기가 생길 때마다 하나 하나 내다 버리는 것보다, 집의 쓰레기통에 모았다가 꽉 차면 한 번에 밖에 버리는 게 훨씬 효울적인 것과 비슷한 개념이라 생각할 수 있다.
📑 BufferedReader란?
Scanner는 띄어쓰기와 개행뭄ㄴ자를 경계로 하여 입력 값을 인식하기에 따로 가공할 필요가 없다. int형 변수를 입력받고자 한다면 int x = scanner.nextInt()를 사용해 원하는 타입의 입력을 받을 수 있다.
그러나 BufferedReader는 개행문자만 경계로 인식하고 입력받은 데이터는 String으로 고정된다. 그렇기에 따로 데이터를 가공해야하는 경우가 많지만 Scanner보다 속도가 빠르다.
📌사용법
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언 String s = br.readLine(); int i = Integer.parseInt(br.readLine());
입력은 readLine()이라는 메서드를 사용한다. String으로 값이 고정되어 있기 떄문에 다른 타입으로 입력을 받고자 한다면 반드시 형변환이 필요하다.
📌 데이터 가공
BufferedReader를 통해 읽어온 데이터는 개행문자 단위(Line 단위)로 나누어진다. 만약 이를 공백 단위로 데이터를 가공하고자 한다면 따로 작업을 해줘야 한다. 이떄 사용하는 것이 StringTokenizer나 String.split() 함수이다.
package step3; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Q4_25304 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int totalPrice = Integer.parseInt(br.readLine()); int totalCount = Integer.parseInt(br.readLine()); int calculPrice=0; //한줄씩 읽어오는데 띄어쓰기를 기준으로, 앞에는 가격 뒤에는 수량. for(int i=0; i<totalCount; i++){ StringTokenizer tokenizer = new StringTokenizer(br.readLine()," ");//공백으로 값을 읽어와라. //★ 지역변수로 할 수 있는 건 지역변수로 하자. int itemPrice = Integer.parseInt(tokenizer.nextToken()); int itemCount = Integer.parseInt(tokenizer.nextToken()); // sum += Integer.parseInt(st.nextToken()) * Integer.parseInt(st.nextToken()); calculPrice += (itemPrice * itemCount); } if(calculPrice == totalPrice){ System.out.println("Yes"); }else{ System.out.println("No"); } } }
📑 BufferedWriter란?
일반적으로 출력할 때, System.out.println("");을 사용한다. 적은 양의 출력에서는 편리하고, 그렇게 큰 성능 차이 없이 사용할 수 있다. 하지만 많은 양의 데이터를 출력할 댸는 입력과 동일하게 버퍼를 사용하는 것이 좋다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언 String s = "abcdef"; // 출력할 문자열 bw.write(s); // 출력 bw.newLine(); // 줄바꿈 bw.flush(); // 남아있는 데이터 모두 출력 bw.close();
BufferedWriter는 System.out.println("") 처럼 출력과 개행을 동시에 해주지 않기 때문에 개행을 위해선 따로 newLine() 또는 bw.write("\n")을 해줘야한다. 그리고 BufferedWriter의 경우 버퍼를 잡아 놓았기 때문에 반드시 사용후에 flush()/ close()를 해줘야한다.
package step3; import java.io.*; public class Q5_25314 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = (Integer.parseInt(br.readLine()))/4; StringBuilder sb = new StringBuilder(); for(int i=0; i<N; i++){ sb.append("long").append(" "); } /* sb.append("int"); System.out.println(sb);*/ sb.append("int"); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언 //bw.write()는 파라미터로 StringBuilder를 받을 수 없다. bw.write(sb.toString()); bw.close(); } }
반응형'프로그래밍 언어 > JAVA' 카테고리의 다른 글
[JAVA] if문 return; break; 차이점 (0) 2023.06.08 [JAVA] repeat 메서드, for문 대신 사용하기 간편! (0) 2023.06.01 [JAVA Stream] map, filter, sorted 사용법 알아보기 (0) 2023.05.24 [JAVA] java.io.File API 주요 메서드 (0) 2023.05.10 [JAVA] java.io.File 의 mkdirs()와 mkdir() 차이 (0) 2023.05.10