본문 바로가기
Java

[Java] BufferedReader, BufferedWriter

by 건복치 2020. 4. 7.
반응형

BufferedReader, BufferedWriter

- 버퍼를 이용해 읽고 쓰는 함수

- 버퍼를 이용해 읽고 쓰기 때문에 입출력 효율이 Scanner, System.out.println("") 등 보다 훨씬 좋다.

- 입력된 데이터가 바로 전달되지 않고 중간에 버퍼링이 된 후에 전달된다.

- 출력 역시 버퍼를 거쳐 간접적으로 출력장치로 전달되기에 입출력이 효율적이다.

Buffer

 - 데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 임시 메모리 영역

 - 입출력 속도 향상을 위해 사용

BufferedReader

 - 버퍼를 이용한 입력

BufferedWriter

 - 버퍼를 이용한 출력

 

왜? 사용하는데?

하드디스크는 원래 속도가 엄청 느리다. 뿐만 아니라 키보드나 모니터와 같은 외부 장치와의 데이터 입출력은 생각보다 시간이 걸리는 작업이다. 버퍼링 없이 키보드가 눌릴 때마다 눌린 문자의 정보를 목적지로 바로 이동시키는 것보다 중간에 메모리 버퍼를 두어 데이터를 한 데 묶어서 이동시키는 것이 보다 효율적이고 빠르다.

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

 

흙을 파서 언덕에 버리는데, 한 번 삽질할 때마다 가서 버리는 것보다, 수레에 가득 채워서 한 번에 나르는 것이 효율적인 것과 같은 이치.

즉, 모아뒀다가 한 번에 전송하는게 훨씬 효율적!

 

BufferedReader

Scanner VS BufferedReader

Scanner를 통해 입력을 받을 경우 Space, Enter를 모두 경계로 인식하기에 입력받은 데이터를 가공하기 매우 편리하다.

하지만 BufferedReader는 Enter만 경계로 인식하고 입력 데이터가 String로 고정되기 때문에 입력받은 데이터를 가공하는 작업이 필요할 경우가 많다.

하지만 많은 양의 데이터를 입력 받을 경우 BufferedReader를 통해 입력받는 것이 효율적

 

BufferedReader 사용법

BufferedReader 선언 후 readLine() 메소드를 이용해 데이터를 라인 단위로 읽어옴.

readLine()의 리턴 값은 String으로 고정되기에 다른 타입으로 입력을 받으려면 형 변환을 해주어야 한다.

 

* 예외처리는 필수

BufferedReader 사용을 위해 throws IOException 이용하거나 try & catch를 활용해 예외처리를 해주어야한다.

아래 코드는 try & catch로 예외처리 한 경우

그냥 BufferedReader만 쓰면 알아서 Eclipse에서 import하라고 경고를 줌(누르면 바로 IOException 적용 가능)

 

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

public class Main {
	public static void main(String[] args) {
		try {
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			String s = br.readLine(); //String
			int i = Integer.parseInt(br.readLine()); //int

			// br.readLine()으로 읽어온 데이터 가공
			// 1. 공백 단위로 구분해 nextToken()을 통해 순서대로 호출
			StringTokenizer st = new StringTokenizer(br.readLine());
			int T = Integer.parseInt(st.nextToken());
			int N = Integer.parseInt(st.nextToken());

			String array[] = s.split(" "); // 2. 공백 단위로 데이터 끊어서 배열에 넣음

		} catch (IOException e) {
			e.printStackTrace();
			System.out.println(e.getMessage());
		}
	}
}

 

Read 한 데이터는 Line단위로만 나눠지기에 공백 단위로 데이터를 가공하려면 따로 작업을 해야 한다.

첫 번째로 StringTokenizer에 nextToken() 함수를 쓰면 readLine()을 통해 입력받은 값을 공백 단위로 구분해 nextToken()을 통해 순서대로 호출할 수 있다.

두 번째는 String.split() 함수를 이용해 배열에 공백 단위로 끊어서 데이터를 넣어 사용한다.

 

BufferedWriter

System.out.println("");와 같이 데이터를 출력하는 함수이다.

많은 양의 출력에서는 입력과 마찬가지로 Buffer를 활용하기 때문에 효율적이다.

 

BufferedWriter의 경우 버퍼를 잡아 놓았기 때문에 반드시 flush()를 통해 버퍼에 남아있는 데이터를 모두 출력하고,

close()를 호출해 스트림을 닫아야 한다.

 

bw.write에는 System.out.println();과 같이 자동 개행 기능이 없기 때문에 개행을 해주어야 할 경우에는 \n를 통해 따로 처리해 주어야 한다.

 

import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		String s = "minha";// 출력할 문자열
		bw.write(s + "\n"); // 출력
		bw.flush(); // 남아있는 데이터를 모두 출력시킴
		bw.close(); // 스트림을 닫음
	}
}

 

주요 메소드

메소드 명

 기능

 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() 

 남아있는 데이터를 모두 출력시킴.

 

https://jhnyang.tistory.com/92
https://coding-factory.tistory.com/251

 

https://jhnyang.tistory.com/92

 

[Java 자바 입출력] BufferedReader/BufferedWriter

[자바 입출력 함수] BufferedReader / BufferWriter BufferedReader/BufferedWriter은 이름처럼 버퍼를 이용해서 읽고 쓰는 함수입니다. 이 함수는 버퍼를 이용하기 때문에 이 함수를 이용하면 입출력의 효율이 비..

jhnyang.tistory.com

https://coding-factory.tistory.com/251

 

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

BufferedReader/BufferedWriter는 Buffer에 있는 IO 클래스입니다. 입력된 데이터가 바로 전달되지 않고 중간에 버퍼링이 된 후에 전달되됩니다. 출력도 마찬가지로 버퍼를 거쳐서 간접적으로 출력장치로 전달되기..

coding-factory.tistory.com

 

반응형

댓글