BufferedReader/BufferedWriter 클래스

Sunny·2022년 7월 4일
0

💡 BufferedReader/BufferedWriter 클래스의 정의

  • BufferedReader : 버퍼를 이용해서 입력하는 함수
    - 엔터만 경계로 인식하고 받은 데이터가 String으로 고정되기 때문에 데이터를 따로 가공해야 함
  • BufferedWriter : 버퍼를 이용해서 출력하는 함수

❗버퍼를 이용하기 때문에 입출력의 효율이 비교할 수 없을 정도로 좋아진다!

cf.

  • 버퍼(buffer) : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 임시 메모리 영역
  • 버퍼 플러시(buffer flush) : 버퍼에 남아있는 데이터를 출력시킴 (버퍼를 비우는 동작)

💡 BufferedReader/BufferedWriter 클래스를 사용하는 이유

위의 그림과 같이 한 번 거쳐가므로 느릴 것 같은데 왜 빠를까?

하드디스크는 원래 속도가 엄청 느리다. 또한, 키보드나 모니터와 같은 외부 장치와의 데이터 입출력도 생각보다 시간이 걸리는 작업이다.

버퍼링없이 키보드가 눌릴 때 마다 눌린 문자의 정보를 목적지로 바로 이동시키는 것보다, 중간에 메모리 버퍼를 두어 데이터를 한번에 묶어 이동시키는 것이 보다 효율적이고 빠르다.

그냥 전송하게 되면 CPU와 성능 갭이 많이 나서 비효율적이다.

예시를 들면 흙을 파서 멀리 있는 언덕에 버리는데, 한 번 삽질할 때마다 가서 버리는 것보다, 수레에 가득 채워서 한번에 나르는 것이 효율적인 것과 같은 이치이다. 즉, 모아뒀다가 한 번에 전송하는 것이 훨씬 효율적!


💡 BufferedReader 사용방법

1. import를 통한 외부 클래스 호출

import java.io.BufferedReader;
  • java.io 패키지 안 BufferedReader라는 기능을 하는 클래스를 가져온다는 의미!

2. BufferedReader 객체 생성

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언

cf. InputStreamReader

  • 문자로 읽기 기능을 하는 클래스

  • InputStreamReader는 반드시 InputStream 객체를 입력으로 가지고 있어야 함

  • 예제

     import java.io.InputStream;
     import java.io.InputStreamReader;
    
     public class Main {
        public static void main(String[] args) throws Exception {
            InputStream in = System.in;
            InputStreamReader reader = new InputStreamReader(in);
    
            char[] a = new char[3];
            reader.read(a);
    
            System.out.println(a);
        }
    	}

3. 입력 받기

String s = br.readLine();  // 1
int i = Integer.parseInt(br.readLine());  // 2

1) 입력은 readLine()이라는 메소드 사용
2) 리턴 값은 String으로 고정되어 있기 때문에, 다른 타입으로 입력을 받고자 한다면 형변환이 반드시 필요. 그리고 예외 처리를 반드시 해주어야 한다.

예외 처리는 readLine()시 마다 try-catch문으로 감싸주어도 되고, throws IOException을 통한 예외처리를 해도 된다. (대부분 후자의 경우를 선택)


4. 데이터 가공
BufferedReader를 통해 읽어온 데이터는 개행문자 단위(Line 단위)로 나누어진다. 만약 이를 공백 단위로 데이터를 가공하고자 하면 따로 작업을 해주어야 한다. 이 때 사용하는 것이 StringTokenizer 이나 String.split() 함수이다.

❗ StringTokenizer의 사용 방법

1) import를 통한 외부 클래스 호출

 import java.util.StringTokenizer;

2) 객체 생성

3) 적재적소에 맞게 반환 메소드 활용

int countTokens()

➡ 남아있는 token의 개수를 반환. 전체 token 갯수가 아닌 현재 남아있는 token 갯수.

boolean hasMoreElements(), boolean hasMoreTokens()

➡ 다음 token 반환

object nextElement(), String nextToken()

➡ 다음 token 반환. nextElement()는 object를, nextToken()은 String을 반환.


💡 BufferedWriter 사용방법

일반적으로 출력을 할 때, System.out.println(""); 을 사용한다. 적은 양의 출력에서는 편리하고, 그헣게 큰 성능 차이 없이 사용할 수 있다. 하지만 우리가 늘 고려해야하는 경우는 양이 많은 경우이다. 많은 양의 출력을 할 때는 입력과 동일하게 버퍼를 사용하는 것이 좋다.

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String str = "abcdef"; // 출력할 문자열
bw.write(str);  // 출력
bw.newLine();   // 줄바꿈
bw.flush();     // 남아있는 데이터 모두 출력
bw.close();     // 스트림 닫음. 닫기 전 반드시 flush() 해야 함

*** 출처 : https://jhnyang.tistory.com/92

profile
개발에 재미를 붙여보기 :)

0개의 댓글