ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BufferedReader, BufferedWriter
    Java 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 reached

    api문서를 보면 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();
                    }
                }
            }
        }
    

    댓글

Paycis's