본문 바로가기
Java/Java

자바입출력/char기반) 버퍼입출력스트림 (BufferedReader, BufferedWriter), try-with-resource절

by 박채니 2022. 3. 29.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


자바 입출력(java IO)

- 프로그램을 기준으로 외부로부터 데이터가 들어오는 입력(input)과 프로그램에서 외부로 나가는 출력(output)으로 구성

- 입력의 대상 : 키보드/마우스/파일/네트워크 등

- 출력의 대상 : 화면/프린터/파일/네트워크/콘솔 등

 

자바 입출력 종류

① byte 단위 입출력

  - 송수신하고자 하는 데이터를 byte 단위로 쪼개 보내고 받는 것

② char 단위 입출력

  - 텍스트 전송에 특화된 방법

 

Reader 클래스의 자식 클래스에는 FileReader, BufferedReader, InputStreamReader가 있고,

Writer 클래스의 자식 클래스에는 FileWriter, BufferedWriter, OutputStreamWriter, printWriter가 있습니다.

 

InputStreamReader와 OutputStreamReader 클래스는 byte 단위의 데이터 입출력 클래스인 InputStream과 OutputStream을 char 단위의 입출력 클래스인 Reader와 Writer로 변환하는 클래스입니다.

 

Reader의 주요 메소드

int skip(long n) n개의 char 스킵하기(실제 스킵된 char 개수를 리턴)
int read() int(4byte)의 하위 2byte에 읽은 데이터를 저장해 리턴
int read(char[] cbuf) 읽은 데이터를 char[] cbuf에 저장하고, 읽은 char개수를 리턴
abstract int read(char[] cbuf, int off, int len) len 개수만큼 읽은 데이터를 char[] cbuf의 off 위치부터 저장 (추상 메소드)
abstract void close() Reader의 자원 반환

 

Writer의 주요 메소드

abstract void flush() 메모리 버퍼에 저장된 데이터 내보내기(실제 출력 수행) (추상 메소드)
void write(int c) int(4byte)의 하위 2byte를 메모리 버퍼에 출력
void write(char[] cbuf) 매개변수로 넘겨진 char[] cbuf 데이터를 메모리 버퍼에 출력
void write(String str) 매개변수로 넘겨진 String 값을 메모리 버퍼에 출력
void write(String str, int off, int len) str의 off 위치에서부터 len 개수를 읽어 메모리 버퍼에 출력
abstract void write(char[] cbuf, int off, int len) char[]의 off 위치에서부터 len 개수를 읽어 출력(추상 메소드)
abstract void close() Writer의 자원 반환(추상 메소드)

 


BufferedReader/BufferedWriter

- 메모리 버퍼를 사용하여 속도를 향상

 

//객체 생성 방법 BufferedReader (Reader)
File file1 = new File("files/test.txt");
BufferedReader br = new BufferedReader(new FileReader(file1));
		
//객체 생성 방법 BufferedWriter (Writer)
File file2 = new File("files/test.txt");
BufferedWriter bw = new BufferedWriter(new FileWriter(file2));

 

객체 생성 방식은 각 2가지가 있습니다.

BufferedReader
BufferedReader(Reader in) 기본값 버퍼 크기 사용
BufferedReader(Reader in, int size) 버퍼의 크기를 직접 지정 가능
BufferedWriter
BufferedWriter(Writer out) 기본값 버퍼 크기 사용
BufferedWriter(Writer out, int size) 버퍼의 크기를 직접 지정 가능

 

파일 읽고/쓰기

//1. 스트림 선언
BufferedReader br = null;
BufferedWriter bw = null;

File src = new File("files/test.txt");
File dest = new File("files/copycopy.txt");
		
try {
	//2. 스트림 객체 생성
	br = new BufferedReader(new FileReader(src));
	bw = new BufferedWriter(new FileWriter(dest));
			
	//3. 데이터 읽기/쓰기
	String data = null;
	//readLine():String 더이상 읽어올 내용이 없다면 null 반환
	while((data = br.readLine()) != null) {
		System.out.println(data);	//개행 단위로 읽어와서 개행문자를 버리고 반환
				
		bw.write(data);
		bw.newLine();	//readLine 반환값에는 개행문자가 없으므로 추가
		bw.flush();
	}
} catch(IOException e) {
	e.printStackTrace();
} finally {
	//4. 자원반납
	try {
		br.close();
	} catch(IOException e) {
		e.printStackTrace();
	}
	try {
		bw.close();
	} catch(IOException e) {
		e.printStackTrace();
	}
}

@콘솔출력값
안녕하세요
Hello
합니당

파일 생성

//copycopy.txt
안녕하세요
Hello
합니당

 


☞ try-with-resource절

- with절에 선언된 Stream객체를 자동으로 반환 처리

- with절에 선언과 객체 할당을 모두 처리

- 여러 객체를 ; (세미콜론)으로 구분

File src = new File("files/test.txt");
File dest = new File("files/trywithresource.txt");
		
//1. 스트림 선언 및 객체 생성
try(
	BufferedReader br = new BufferedReader(new FileReader(src));
	BufferedWriter bw = new BufferedWriter(new FileWriter(dest));
) {
	String data = null;
	//2. 데이터 읽기/쓰기			
	while((data = br.readLine()) != null) {
		System.out.println(data);
				
		bw.write(data);
		bw.newLine();
		bw.flush();
	}	
} catch(IOException e) {
	e.printStackTrace();
}

파일 생성

//filewithresource.txt
안녕하세요
Hello
합니당

with절 (~)에 선언된 Stream 객체는 자동으로 반환처리가 되므로 finally에 작성하였던 close()메소드를 이용한 자원 반납 코드는 없어도 됩니다.

 

조금은 더 간단해졌네요!