-
BufferedReader/Writer알고리즘(자바) 2022. 6. 14. 02:25
입출력 방식을 빠르게 하기 위해서 사용한다.
BufferedReader 은 Scanner와
BufferedWriter 은 System.out.println()와
유사하다.
이렇게 둘은 속도 측면에서 훨씬 빠르지만, 받은 데이터를 가공하는 작업이 필요한 경우가 많다.
사용하려면
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter;
이들을 import해줘야한다. 또는 ctrl + shift + o 를 누르면 이클립스에서 제공해주긴 한다.
BufferedReader을 먼저 알아보자.
그러기 위해서, readLine()을 알아보자. readline은 한 줄만 읽는 함수인데,
5
1,2,3,4,5 가 있으면 readLine으로 읽을 떄, 5는 5를 읽고 Integer.parseInt()로 int타입으로 바꾸면 되는데,
두번째 줄은 readLine으로 읽고, StringTokenizer나 split을 통해 각각 따로 읽고 배열에 집어넣게 된다.
그래서 보면,
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언 String s = bf.readLine(); //String int i = Integer.parseInt(bf.readLine()); //Int
먼저 인스턴스를 만들고, String은 bf.readline을 하면되고, int는 Integer.parseInt()를 해주면 되는데, 배열같이 예외처리를 해주려면 throws IOException를 이용해준다. throw를 사용하려면
import java.io.IOException; public static void main(String[] args) throws IOException { }
import를 해주고, main에 throws IOException를 붙여준다. 그리고
import java.util.StringTokenizer; StringTokenizer st = new StringTokenizer(s); //s라는 문자열을 넣음 //StringTokenizer st = null이렇게 객체선언 가능 int a = Integer.parseInt(st.nextToken()); //첫번째 호출 int b = Integer.parseInt(st.nextToken()); //두번째 호출
이렇게 StringTokenizer변수 st에 문자열 s="a b c d"가 들어가면 a,b,c,d이렇게 나눠서 들어가게 된다.
기본적으로 구분자 집합이 토큰으로 처리되지 않기 때문인데,
여기서, nextToken()을 이용해 st.nextToken을 하면 토큰을 하나하나 불러오게 된다.
그리고 StringTokenizer로 구분자를 추가할 수 있는데,
String str = "a b c d e f g"; StringTokenizer st = new StringTokenizer(str, "ac ");
이렇게 하면, 공백문자를 제외하고도 ac가 제외된다. 그래서 결과값은 b d e f g가 된다.
String array[] = s.split(" ");
split를 이용해 공백단위로 끊어서 데이터를 넣고 사용하는 방식이다.
이제,BufferedWriter 을 알아보자.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //할당된 버퍼에 값 넣어주기 String s = "abcdefg"; //출력할 문자열 bw.write(s+"\n"); //버퍼에 있는 값 전부 출력 bw.flush(); //남아있는 데이터를 모두 출력시킴 bw.close(); //스트림을 닫음
위처럼 버퍼에 값을 넣어주고, write로 출력해주고 flush, close로 뒤처리를 해주면 된다.
여기서 bw.write는 자동개행기능이 없어서 \n으로 처리해주면 된다.
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.IOException; import java.util.StringTokenizer; public class HelloJava { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); int a = Integer.parseInt(bf.readLine()); StringTokenizer st; for (int i = 1 ; i < a+1; i++) { st = new StringTokenizer(bf.readLine()," "); bw.write(Integer.parseInt(st.nextToken())+Integer.parseInt(st.nextToken())+"\n"); } bw.flush(); bw.close(); } }
이해를 위해 위 코드를 리뷰해보면
먼저 입력을 받아서 그만큼 반복해주게 짠 다음, StringTokenizer st; 로 st변수를 만들고,
반복문 안에서 변수st에 bf.readLine()으로 값을 받는데, " "로 띄어쓰기를 제거해주겠다 하면된다. 근데 기본으로 공백은 제거해주므로 안 적어도 상관없다. 2개의 값을 적던 3개의 값을 적던 적은거의 1번째 2번째 를 더해주는 코드가 된다.