본문 바로가기

카테고리 없음

I/O 스트림 (3) - 문자 단위 입출력 스트림, 보조 스트림

반응형

문자 단위 입출력 스트림



Reader


  • 문자 단위 입력 스트림 최상위 추상 클래스
  • 많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현

 

주요 하위 클래스

FileReader : 파일에서 문자 단위로 읽는 스트림 클래스

InputStreamReader : 바이트 단위로 읽은 자료를 문자로 변환해주는 보조 스트림 클래스

BufferedReader : 문자로 읽을 때 배열을 제공하여 한꺼번에 읽을 수 있는 기능을 제공하는 보조 스트림

주요 메서드

int read( ) : 파일로부터 한 문자를 읽음. 읽은 문자를 반환

int read(char[ ] buf) : 파일로부터 buf 배열에 문자를 읽음

int read(char[ ] buf, int off, int len) : 파일로부터 buf 배열의 off 위치로부터 len 개수만큼의 문자를 읽음

void close( ) : 입력 스트림과 연결된 대상 리소스를 닫음.

 


Writer


  • 문자 단위 출력 스트림 최상위 추상 클래스
  • 많은 추상 메서드가 선언되어 있고 이를 하위 스트림이 상속받아 구현

 

주요 하위 클래스

FileWriter : 파일에서 문자 단위로 출력하는 스트림 클래스

Output StreamWriter : 바이트 단위의 자료를 문자로 변환해 출력해주는 보조 스트림 클래스

BufferedWriter : 문자로 쓸 때 배열을 제공하여 한꺼번에 쓸 수 있는 기능을 제공하는 보조 스트림

주요 메서드

int write(int c) : 한 문자를 파일에 출력

int write(char[ ] buf) : 문자 배열 buf의 내용을 출력

int write(char[ ] buf, int off, int len) : 문자 배열 buf의 off 위치에서부터 len 개수의 문자를 출력

int write(String str) : 문자열 str을 출력

int write(String str, int off, int len) : 문자열 str의 off번째 문자로부터 len 개수만큼 출력

int flush( ) : 출력하기 전에 자료가 있는 공간(출력 버퍼)을 비워 출력

void close( ) : 스트림과 연결된 리소스를 닫음. 출력 버퍼도 비워짐 


 

보조 스트림


  • 실제 읽고 쓰는 스트림이 아닌 보조 기능을 제공하는 스트림
  • FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스들
  • 생성자의 매개변수로 또 다른 스트림(기반 스트림이나 다른 보조 스트림을 가짐)
  • Decorator Patter으로 구현

 

상위 클래스 생성자

protected FilterInputStream(InputStream in) : 생성자의 매개변수 InputStream을 받음.

public FilterOutputStream(OutputStream out) : 생성자의 매개변수로 OutputStream을 받음.

스트림 작성 형태

Socket socket = new Socket();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

위 코드처럼 socket.getInputStream( )이 기반 스트림이 되고,

InputStreamReader가 바이트를 문자로 변환해주는 보조 스트림이고,

BufferedReader가 속도까지 빠르게 해주는 버퍼링 기능인 보조 스트림이다.


InputStreamReader와 OutputStreamWriter

  • 바이트 단위로 읽거나 쓰는 자료를 문자로 변환해주는 보조 스트림

 

FileInputStream으로 읽은 자료를 문자로 변환해주는 예

public class InputStreamReaderTest {

	public static void main(String[] args) {

		try(InputStreamReader isr = new InputStreamReader(new FileInputStream("reader.txt"))){
			int i;
			while( (i = isr.read()) != -1){  //보조 스트림으로 읽음
				System.out.print((char)i);
			}
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

 


BufferedInputStream과 BufferedOutputStream

  • 약 8k의 배열이 제공되어 입출력을 빠르게 하는 기능이 제공되는 보조 스트림
  • BufferedReader와 BufferedWriter는 문자용 입출력 보조 스트림

 

BufferedInputStream과 BufferedOutputStream을 이용하여 파일 복사하는 예

public class BufferedStreamTest {

	public static void main(String[] args) {

		long millisecond = 0;
		try(FileInputStream fis = new FileInputStream("a.zip");
				FileOutputStream fos = new FileOutputStream("copy.zip");
				BufferedInputStream bis = new BufferedInputStream(fis);
				BufferedOutputStream bos = new BufferedOutputStream(fos)){
		
			millisecond = System.currentTimeMillis(); //현재시간
			
			int i;
			while( ( i = bis.read()) != -1){
				bos.write(i);
			}
			
			millisecond = System.currentTimeMillis() - millisecond; //실행완료까지 걸린 시간
            
		}catch(IOException e) {
			e.printStackTrace();
		}
		
		System.out.println("파일 복사 하는 데 " + millisecond + " milliseconds 소요되었습니다.");
	}
}

 버퍼 스트림으로 감싸기 전 실행 완료까지 걸린 시간은 대략 28초가 걸렸으나..

버퍼 스트림으로 감싼 후 출력하면 대략 0.4초가 걸렸다


DataInputStream과 DataOutputStream

  • 자료가 메모리에 저장된 상태 그대로 읽거나 쓰는 스트림

DataInputStream 메서드
DataOutputStream 메서드

반응형