[JAVA] BufferedReader, BufferedWriter
- [ Languages ]/Java
- 2022. 2. 13.
BufferedReader
기존에 java에서 입출력을 관리할때는 흔히 Scanner를 사용했다.
Scanner는 정수값으로 int, long, short, 부동소수값으로 float, double, 문자열은 String값으로 구분해서 읽을 수 있다.
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
long l = sc.nextLong();
short s = sc.nextShort();
float f = sc.nextFloat();
Double d = sc.nextDouble();
String str = sc.next();
String str2 = sc.nextLine();
반면 BufferedReader는 문자열만을 읽을 수 있기 때문에 Scanner를 사용하는 것이 일반적으로 편리했기 때문이다.
하지만 시간/공간복잡도가 중요한 문제를 풀 때는 Scanner만을 사용하면 시간초과가 나는 경우가 많다.
BufferedReader(8kb)는 Scanner(1kb)와 달리 한번에 더 큰 버퍼 단위로 데이터를 읽어오고, Scanner의 경우 입력을 받을 때마다 정규식을 이용하여 입력값을 검사하기 때문이다. 즉, 입력 크기가 충분히 크다면 한번에 많은 메모리를 읽어오는 BufferedReader가 속도와 메모리측면에서 유리하다.
q. 왜 공간복잡도도 bufferedreader가 좋을까?
다만 BufferedReader의 경우 모든 input을 String으로만 읽어오기 때문에 아래와 같이 데이터 가공이 필요한 경우가 많다.
실사용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int i = Integer.parseInt(br.readLine);
먼저 위와 같이 BufferedReader를 사용하여 문자열을 읽어올때는 readLine()함수를 사용하여 읽어오면 된다. 대신 문자열이 아닌 다른 형의 입력값을 읽어올때는 문자열을 parsing할 수 있는 함수를 이용해야 한다.
또한 공백, 혹은 개행문자를 기준으로 다양하게 읽어올 수 있는 Scanner와 달리, BufferedReader를 사용하면 보통 readLine()을 이용하여 줄 단위로 읽어오게 된다. 따라서 읽어온 데이터를 가공하기 위하여 흔히 다음과 같은 방법을 사용한다.
1. 문자열
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
//StringTokenizer를 이용하여 공백단위로 분리
StringTokenizer st = new StringTokenizer(str);
String str1 = st.nextToken();
String str2 = st.nextToken();
//String의 split함수를 이용하여 공백단위로 분리
String[] strArr = str.split(" ");
먼저 StringTokenizeer의 nextToken()함수를 이용하여 readLine()을 통해서 입력받은 값을 공백단위로 분리할 수 있다.
두번째로 String의 split()함수를 이용하면 지정한 문자를 기준으로 문자열을 끊어서 사용이 가능하다. 위의 예제에서는 공백을 기준으로 분리하여 사용하는 방법을 사용하고 있다.
2. 정수, 소수
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str);
int i1 = Integer.parseInt(st.nextToken());
int i2 = Integer.parseInt(st.nextToken());
위에서 문자열을 읽었듯이 StringTokenizer를 이용하여 문자열을 읽어오고, parsing함수를 이용하여 int형으로 변환하여 사용하면 된다.
BufferedWriter
BufferedWriter bw = new BufferedWriter(new OutputStreamReader(System.out));
String str = "output";
bw.write(s);
bw.flush();
bw.close();
BufferedWriter의 경우 Reader와 같이 복잡한 차이는 없지만, write함수의 경우 System.out의 println함수와 같이 자동 개행을 해주지 않으므로 개행을 위해서는 "\n"을 추가해주어야 하고, 사용이 끝난 후에는 flush()와 close()함수를 통해서 남아있는 데이터를 출력하고 스트림을 닫아주어야 한다.
'[ Languages ] > Java' 카테고리의 다른 글
[Java] 자바의 동작 원리와 특징 (0) | 2022.07.08 |
---|---|
[Java] 자바의 싱글톤 패턴 (0) | 2022.07.02 |
[Java] equals와 hashCode (0) | 2022.02.01 |
[Java] static에 관한 생각 (0) | 2022.01.24 |
[JAVA] 객체의 비교 - Comparable과 Comparator (0) | 2022.01.16 |