[Java] BufferedReader, BufferedWriter를 활용한 빠른 입출력

BufferedReader/BufferedWriter는 Buffer에 있는 IO 클래스입니다. 입력된 데이터가 바로 전달되지 않고 중간에 버퍼링이 된 후에 전달되됩니다. 출력도 마찬가지로 버퍼를 거쳐서 간접적으로 출력장치로 전달되기에 시스템의 데이터처리 효율성을 높여주며 버퍼스트림을InputStreamReader / OutputStreamWriter를 같이 사용하여 버퍼링을 하게 되면 입출력 스트림으로부터 미리 버퍼에 데이터를 갖다 놓기 때문에 보다 효율적인 입출력이 가능합니다.

     

     BufferedReader 

    Java를 처음 접하시는 분들이 주로 받는 입력방식은 Scanner입니다. Scanner를 통해 입력을 받을경우 Space Enter를 모두 경계로 인식하기에 입력받은 데이터를 가공하기 매우 편리합니다. 하지만 그에비해 BufferedReader는 Enter만 경계로 인식하고 받은 데이터가 String으로 고정되기때문에 입력받은 데이터를 가공하는 작업이 필요할경우가 많습니다. Scanner에 비해 다소 사용하기 불편하죠. 하지만 많은 양의 데이터를 입력받을경우 BufferedReader를 통해 입력받는 것이 효율면에서 훨씬 낫습니다. 입력시 Buffer를 활용함으로써 작업속도 차이가 많이납니다.

     

    BufferedReader 사용법

    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
    String s = bf.readLine(); //String
    int i = Integer.parseInt(bf.readLine()); //Int

     선언은 위에 있는 예제와 같이 하시면 됩니다. 입력은 readLine();이라는 메서드를 활용하시면 되는데요. 여기서 주의할점이 두가지가 있습니다. 첫번째는 readLine()시 리턴값을 String으로 고정되기에 String이 아닌 다른타입으로 입력을 받을려면 형변환을 꼭 해주어야한다는 점입니다. 두번째는 예외처리를 꼭 해주어야한다는 점입니다. readLine을 할때마다 try & catch를 활용하여 예외처리를 해주어도 되지만 대개 throws IOException을 통하여 작업합니다.

     

    Read한 데이터 가공

    StringTokenizer st = new StringTokenizer(s); //StringTokenizer인자값에 입력 문자열 넣음
    int a = Integer.parseInt(st.nextToken()); //첫번째 호출
    int b = Integer.parseInt(st.nextToken()); //두번째 호출
    
    String array[] = s.split(" "); //공백마다 데이터 끊어서 배열에 넣음

     Read한 데이터는 Line단위로만 나눠지기에 공백단위로 데이터를 가공하려면 따로 작업을 해주어야하는데요. 위의 두가지 방법이 대표적입니다. 첫번째 방법으로는 StringTokenizer에 nextToken()함수를 쓰면 readLine()을 통해 입력받은 값을 공백단위로 구분하여 순서대로 호출할 수 있습니다. 두번째방법으로는 String.split()함수를 활용하여 배열에 공백단위로 끊어서 데이터를 넣고 사용하는 방식입니다.

     

     BufferedWriter 

    일반적으로 출력을할때 System.out.println(""); 방식을 사용하고는 합니다. 적은양의 출력일 경우 성능차이가 미미하겠지만 많은 양의 출력에서는 입력과 마찬가지로 Buffer를 활용해주시는것이 좋습니다.

     

    BufferedWriter 사용법

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//선언
    String s = "abcdefg";//출력할 문자열
    bw.write(s);//출력
    bw.newLine(); //줄바꿈
    bw.flush();//남아있는 데이터를 모두 출력시킴
    bw.close();//스트림을 닫음

    BufferedWriter 의 경우 버퍼를 잡아 놓았기 때문에 반드시 flush() / close() 를 반드시 호출해 주어 뒤처리를 해주어야합니다. 그리고 bw.write에는 System.out.println();과 같이 자동개행기능이 없기때문에 개행을 해주어야할 경우에는 \n를 통해 따로 처리해주어야합니다.

     

    주요 Method

    메서드명   기능
     BufferedReader(Reader rd)  rd에 연결되는 문자입력 버퍼스트림 생성
     BufferedWriter(Writer wt)   wt에 연결되는 문자출력 버퍼스트림 생성​
     int read()  스트림으로부터 한 문자를 읽어서 int 형으로 리턴
     int read(char[] buf)  문자배열 buf의 크기만큼 문자를 읽어들임.  읽어들인 문자 수를 리턴
     int read(char[] buf, int offset, int length)  buf의 offset위치에서부터 length 길이만큼 문자를 스트림으로부터 읽어들임​
     String readLine()  스트림으로부터 한 줄을 읽어 문자열로 리턴​​
     void mark()   현재우치를 마킹, 차 후 reset() 을 이용하여 마킹위치부터 시작함
     void reset()   마킹이 있으면 그 위치에서부터 다시시각, 그렇지 않으면 처음부터 다시시작
     long skip(int n)  n 개의 문자를 건너 뜀
     void close()  스트림 닫음
     void write(int c)  int 형으로 문자 데이터를 출력문자스트림으로 출력
     void write(String s, int offset, int length)  문자열 s를 offset 위치부터 length 길이만큼을 출력스트림으로 출력
     void write(char[] buf, int offset, int length)  문자배열 buf의 offset 위치부터 length 길이만큼을 출력스트림으로 출력​​​
     void newLine()  줄바꿈 문자열 출력
     void flush()   남아있는 데이터를 모두 출력시킴.

     

    [Java] 현재날짜, 현재시간을 원하는 형태로 출력하는(Format) 다양한 방법

    [Java] ArrayList로 구현한 Memory구조(Stack,Pop)

     

    댓글

    Designed by JB FACTORY