BufferedReader 와 BufferedWriter

Shin·2022년 11월 30일
0

Java

목록 보기
1/6

1. BufferedReader

Buffer 라는 개념을 활용하기 때문에, FileReader 보다 더 효율적으로 파일을 읽어올 수 있다.


버퍼를 이용하는 것이 얼핏 보기에는 더 비효율적으로 보일 수도 있지만 한 번에 모아서 처리함으로 인해 빠른 연산이 가능해진다.

예를 들면 땅을 팔 때,

한 번 삽으로 흙을 푼 후 외부로 버리러 가는 것보다

하나의 소쿠리에 흙을 모두 채운 후 한 번에 버리러 가는 것이 더 효율적인 것과 비슷한 개념이라고 보면 될 것이다.

public BufferedReader(Reader in);
//
public BufferedReader(Reader in, int sz);
//

// Reader in = Reader의 객체를 의미한다.
// sz = buffer의 사이즈를 지정하는 것인데, 파라미터로 입력되는 단위는 byte 이다. 
// 또한 BufferedReader 의 기본 Buffer 사이즈는 8kb이다.

1-1. 한 줄의 데이터를 입력할 경우

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BufferedReader01 {
    public static void main(String[] args) throws IOException {
    	
        // 콘솔에서 데이터를 입력할 경우
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // 텍스트 파일 등에서 데이터를 불러올 경우
        FileReader fr = new FileReader('D\java\...txt');
        BufferedReader br_f = new BufferedReader(fr);
        
        // readLine을 통해 불러오는 buffer은 기본이 문자형
        String s = br.readLine();
        // 따라서 정수형 데이터를 사용하려면 형 변환이 필요함
        int i = Integer.parseInt(s);
        
    }

BufferedReader 는 줄, 라인 단위로 데이터를 읽는다. 그리고 이렇게 읽혀진 데이터는 String 타입으로 저장된다. 따라서 원하는 데이터 출력이 문자형이 아니라면, 형 변환을 해야만 한다.

또한 BufferedReader 는 예외처리가 필수적이다. 따라서 readline 을 사용할 때 마다 try-catch 를 활용하거나 본문의 throws IOException 을 통해 예외 처리를 한다.

1-2 복수 줄의 데이터를 입력할 경우 ( StringTokenizer + split 를 활용한다. )

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class BufferedReader02{
    public static void main(String[] args) throws IOException {
    
    	// 콘솔에서 입력받을 경우
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // 파일에서 불러올 경우
        FileReader fr = new FileReader('D\java\...txt');
        BufferedReader br_f = new BufferedReader(fr);
        
        // buffer의 기본은 문자형
        String s = br.readLine();   // 입력을 22 33 로 받음
        
        // StringTokenizer 을 사용할 경우
        StringTokenizer st = new StringTokenizer(s);
        int a = Integer.parseInt(st.nextToken());  //22
        int b = Integer.parseInt(st.nextToken());  //33
 
        String[] arr = s.split(" ");  
        for (String k : arr) {
            System.out.println(k);   //22 와 33가 나옴
            
        // split만을 활용하는 경우
        String[] Tokens = s.split(" ");
            for(int i=0; i<Tokens.length; i++){
                System.out.println(Tokens[i]);
            }
        }
 
    }
}

기억해야 할 것은 bufferedreader 와 Scanner의 차이점은 공백처리의 여부이다. 스캐너는 공백과 개행을 모두 포함하여 개개로 입력을 받지만 버퍼리더의 경우, 공백은 고려대상이 되지 못하여, 개행을 기준으로 출력이 된다.
이 때에는 첫번째로 StringTokenizer 클래스를 이용하고 두번째로 Splite(" ")메소드를 이용해서 입력받은 문자를 나눈다.

2. BufferedWriter

이는 기본적으로 System.out.println() 과 동일한 기능을 수행하는 메소드이다.

import java.io.*;
import java.util.StringTokenizer;

public class BufferedWriter {
    public static void main(String[] args) throws IOException{
        
        int a = 13579;
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        // BufferWriter 의 경우, 문자형만 출력이 가능하기 때문에, String.ValueOF()로 형변환 필수
        
        bw.write(String.valueOf(a)+"\n");
        // bw은 개행이 되지 않기 때문에, 출력에 "\n" 라는 개행코드도 함께 입력
        // write를 쓴다고 출력이 되는 것이 아님. write는 버퍼에 입력를 한다는 개념으로 보면 편함
        
        bw.flush();
        // flush를 통해서 white가 계속적으로 일어나도록 할 수 있다. 즉 버퍼가 닫히지 않고 계속 열려있도록 한다.
        
        String T = "hi";
       
        bw.write(T+"\n");
        
        bw.close();
        // 최종적으로 close를 입력해야지만 출력이 완료됨.

참고예제

0개의 댓글

관련 채용 정보