-
BufferedReader, BufferedWriterJava 2021. 5. 21. 19:30
백준 알고리즘 문제를 푸는데 시간초과로 인해 실패하는 경우가 발생했다. 원인은
Scanner, System.in, System.out
의 성능때문이었는데, 입출력의 개수가 많은경우 속도가 매우 느려진다.위와 같은 문제를 해결하기 위해 사용하는것이
BufferedReader, BufferedWriter
다.BufferedReader
아래와 같이 사용할 수 있습니다.
import java.io.*; class Main { public static void main(String args[]) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { String line = br.readLine(); } catch(IOException e) { e.printStackTrace(); } finally { if(br != null) { try { br.close(); } catch(Exception e) { e.printStackTrace(); } } } } }
만약 한줄에 구분자(delimiter)를 사용하여 여러값을 받는경우
StringTokenizer
를 사용하여 값을 분리해서 사용할 수 있다.//생략 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); //두번째인자로 구분자 설정 가능. default는 공백(space) String option = st.nextToken(); int val = Integer.parseInt(st.nextToken()); //생략
BufferedWriter
아래와 같이 사용가능합니다.
import java.io.*; class Main { public static void main(String args[]) { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); try { bw.write("hello\n"); // line변경이 필요할 경우 \n 값 입력 필요 bw.flush(); } catch(IOException e) { e.printStackTrace(); } finally { if(bw != null) { try { bw.close(); } catch(Exception e) { e.printStackTrace(); } } } } }
18.08.06 내용추가
BufferedReader.read()
메서드를 보면 분명 return 값이int
로 되어있다. 하지만 값을 입력받아 출력하면 원하는 값이 아닌 이상한 숫자가 출력되는걸 볼 수 있다.Reads a single character.
Returns:
The character read, as an integer in the range 0 to 65535 (0x00-0xffff), or -1 if the end of the stream has been reachedapi문서를 보면
public int read()
메서드의 설명이 위와같이 나와있다.read()
를 통해 얻을 수 있는 int값은 숫자 1이 아니라character '1'
의 값 (아스키 코드) 49 가 나온다.그래서 bufferedWriter 를 통해 출력할때
bw.write(a-'0');
을 하는경우 우리가 원하는 int값을 볼 수 있다.public static void main(String[] args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); try { int a = br.read(); int b = br.read(); bw.write(Integer.toString(a)+"\n"); bw.write((a-'0')+"\n"); bw.flush(); } catch (Exception e) { e.printStackTrace(); } finally { if (br!=null) { try { br.close(); } catch(Exception e) { e.printStackTrace(); } } if (bw!=null) { try { bw.flush(); bw.close(); } catch(Exception e) { e.printStackTrace(); } } } }
'Java' 카테고리의 다른 글
자바 - SRP (Single Responsibility Principle, 단일책임원칙) (0) 2023.11.22 자바 - OCP (Open Closed Principle / 개방-폐쇄원칙) (0) 2023.11.22 json을 자바 객체로 변환하기 (0) 2021.05.20 visualVM으로 remote host 모니터링하기 (0) 2021.05.17 Stream, 왜 재사용 할 수 없을까 (1) 2021.03.01