공부/Java

[Java] BufferedReader와 BufferedWriter

줭♪(´▽`) 2021. 6. 13. 18:37

1. Buffer

- 코딩테스트와 같이 실행 속도와 같은 효율을 고려해야하는 경우, IO를 대부분 Scanner와 System.out.println보다는 BufferedReader와 BufferedWriter를 사용함

- 버퍼(Buffer) : 데이터를 어떤 지점에서 다른 지점으로 전송하는동안 일시적으로 데이터를 보관하는 메모리의 영역

- Buffer를 사용하는 이유

 (1) Buffer를 사용하지 않는 경우, 사용자가 입력하는 즉시 프로그램에 전달됨 (성능저하)

 (2) Buffer를 사용하는 경우, 사용자가 입력을 마칠 때까지 Buffer에 담아뒀다가 입력이 끝나면 한꺼번에 프로그램으로 전달

- Stream을 사용하기 때문에 예외처리가 요구됨

 (1) try-catch를 사용함

 (2) 메서드에 throws IOException 처리

 

 

2. BufferedReader

- JDK 1.5 이후 추가된 Scanner와 같은 기능을 하는 객체

- 짧은 문자열일 경우 Scanner가 효율적이지만, 긴 문자열일 경우 BufferedReader를 사용하는 것이 시간을 줄여줌

- readLine()를 사용하여 한 줄씩 읽어들임

- 단, String으로만 인식하기 때문에 형변환 필요 (Scanner는 다양한 타입 가능)

- close()를 호출해줘야 함

 

import java.io.*;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) throws IOException {
    	// (1) BufferedReader 사용
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in);
        String str = br.readLine();
        
        br.close();
        
        
        // (2) Scanner 사용
        Scanner sc = new Scanner(System.in);
        String str2 = sc.nextLine();
        int n = sc.nextInt();
       
        sc.close();
    }
}
        

 

 

3. BufferedWriter

- System.out.println()과 같은 기능을 하는 객체

- 출력할 값을 buffer에 담아두었다가 한꺼번에 출력을 함

- append()로 데이터를 buffer에 추가

- 개행처리를 위해서 직접 "\n"과 같은 문자열을 추가해줘야 함

- flush()로 데이터를 프로그램에 전달

- close()를 호출해줘야 함 (close()는 내부적으로 flush()를 호출하기 때문에 flush()와 중복할 필요는 없음)

 

import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
    	// (1) BufferedWriter 사용
    	BufferedWriter bw = new BufferedWriter(new OutputStreamReader(System.out);
        bw.append("Hello ");
        bw.append("World\n");
        bw.flush(); // close() 있으면 생략 가능
        bw.close();
        
        
        // (2) System.out.println 사용
        System.out.println("Hello World");
    }
}
        

 

 

4. 예외처리

- 두 가지 방법으로 예외처리 가능

(1) try-catch 사용

import java.io.*;

public class Main {
	public static void main(String[] args) {
    	BufferedReader br;
        BufferedWriter bw;
    	try {
    		br = new BufferedReader(new InputStreamWriter(System.in);
    		bw = new BufferedWriter(new OutputStreamReader(System.out);
            ...
        } catch(IOException e) {
        	e.printStackTrace();
        } finally {
        	if (bw != null) {
            	try {
                	bw.close();
                } catch (IOException e) {
                	e.printStackTrace();
                }
            }
        }
       	
        
        
    }
}
        

 

(2) IOException 처리

import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
    	BufferedReader br = new BufferedReader(new InputStreamWriter(System.in);
    	BufferedWriter bw = new BufferedWriter(new OutputStreamReader(System.out);
        ....
    }
}