[네트워크 프로그래밍1]바이트 입출력 스트림 정리

류명운

·

2015. 4. 12. 17:02

반응형

  자바는 사용하는 운영체제 및 시스템에 관계없이 모든 입출력 장치에 스트림(stream)을 이용하여 입출력을 수행한다.

1. 스트림이란?

->자바에서 입출력을 수행하려면, 즉 어느 한쪽에서 다른 쪽으로 데이터를 전달하려면, 두 대상을 연결하고 데이터를 전솔할 수 있는 무언가가 필요한데 이것을 스트림 이라 한다.

->자바는 독립적인 입출력의 기능을 제공하며, java.io 패키지에서 스트림을 구현하기 위해 약 40여개의 스트림 클래스를 제공한다.

->스트림 클래스는 처리하는 데이터가 바이트 단위(2진수 데이터로 취급)인가 또는 문자 단위(char 2byte)인가에 따라서 구분된다.

->스트림은 단방향 통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다.

->스트림은 먼저 보낸 데이터를 먼저 받게 되어 있으며, 중간에 건너뜀 없이 연속적으로 데이터를 주고 받는다. 큐와 같은 FIFO(First In First Out)구조로 되어 있다고 생각하면 된다.

 

2. 바이트 입출력 클래스

->바이트 단위로 데이터를 전송하는 입출력 클래스를 뜻한다.

- [그림 1]은 java.io 패키지에서 바이트 단위로 데이터를 송수신하는 클래스들을 보여주며 단순한 입출력만을 담당하는 기본적인 입출력 스트림(짙은 색깔로 표시) 클래스 및 스트림에 들어온 데이터를 조작하는 필터 스트림 클래스로 구분할 수 있다.

- 바이트 출력 스트림 클래스들은 [그림 1]의 OutputStream 클래스 및 그의 하위 클래스들이며 메모리의 내용을 파일 및 네트워크 등과 같은 출력장치에 출력하는 클래스들이다.

- 바이트 입력 스트림 클래스들은 [그림 1]의 InputStream 클래스 및 그의 하위 클래스들이며 파일 및 네트워크 등과 같은 입력장치로부터 데이터를 읽어서 메모리에 저장하는 클래스 들이다.

 

2.1 OutputStream 클래스

->메모리에 있는 바이트 데이터를 파일이나 다른 컴퓨터와 같은 특정한 미디어로 전송하는데 필요한 기본적인 메소드들을 아래와 같이 지원한다.

 OutputStream에 정의된 메소드

설명 

 void close() throws IOException

 - OutputStream을 닫는다

 void flush() throws IOException

 - 버퍼에 남은 출력 스트림을 강제로 출력한다.(버퍼가 있을 경우)

 abstract void write(int i) throws IOException

 - 정수 i의 하위 8비트를 출력한다

 void write(byte buffer[]) throws IOException

 - buffer의 내용을 출력한다

 void write(byte buffer[], int index, int size) throws IOException

 - buffer의 index 위치부터 size만큼의 바이트를 출력한다

*  getBytes() 메소드를 사용하여 문자 데이터(4바이트)를 바이트 데이터로 변환 시킬 수 있다.

 

2.2 InputStream 클래스

 InputStream에 정의된 메소드

설명 

 int available() throws IOException

 - 현재 읽을 수 있는 바이트 수를 얻는다

 void close() throws IOException

 - InputStream을 닫는다

 void mark(int readlimit)

 - InputStream에서 현재 위치를 표시한다

 boolean markSupported()

 - 해당 InputStream에서 mark()로 지정된 지점이 있는지 여부를 체크한다

 abstract int read() throws IOException

 - InputStream으로부터 한 바이트를 읽어서 상위 24비트는 0으로 채운 int 값으로 반환한다. (더 이상 읽어 올 데이터가 없으면 -1을 반환)

 int read(byte[] b) throws IOException

 - byte[] b 만큼의 데이터를 읽어서 b에 저장하고 읽은 바이트 수를 반환한다.

 int read(byte[] b, int off, int length)  throws IOException

 - length만큼 읽어서 byte[off] b위치부터 저장하고 읽은 바이트 수를 반환한다.

 void reset()

 - mark()를 마지막으로 호출한 위치로 이동한다

 long skip(long n) throws IOException

 - InputStream에서 n바이트 만큼 데이터를 스킵하고 바이트 수를 반환한다

 

2.3 FileOutputStream 클래스(OutputStream의 하위 클래스)

->메모리의 내용을 읽어서 파일로 저장하는 기능을 수행한다.

- FileOutputStream 클래스는 아래와 같이 5개의 생성자 메소드를 가진다.

 FileOutputStream의 생성자

설명 

 FileOutputStream(String filePath) throws IOException

 - filePath로 지정한 파일에 대한 OutputStream을 생성

 FileOutputStream(String filePath, Boolean append) throws IOException

 - filePath로 지정한 파일에 대한 OutputStream을 생성하고 append 인자값에 따라 출력 할 때 append 모드를 설정한다(true ->이어쓰기)

 FileOutputStream(File fileObj) throws IOException

 - fileObj로 지정한 파일에 대한 OutputStream을 생성

 FileOutputStream(File fileObj, Boolean append) throws IOException

 - fileObj로 지정한 파일에 대한 OutputStream을 생성하고 append 인자값에 따라 출력 할 때 append 모드를 설정한다(true ->이어쓰기)

 FileOutputStream(FileDescripor fdObj) throws IOException

 - fdObj로 기존의 접속을 나타내는 파일 시스템의 OutputStream을 생성

*overwrite: 기존에 존재하는 파일에 데이터를 저장하면 이전의 데이터는 모두 지워지고 새로운 데이터가 저장된다(append 모드 설정에서 인자값을 true로 해주면 해결)

*자바는 열려진 모든 파일에 대한 FileDescriptor 객체를 생성한다.

   키보드로부터 데이터 입력 -> 메모리 저장 -> 파일로 저장

 int bytesRead;

 byte buffer[] = new byte[256];

 FileOutputStream fos = new FileOutputStream("test.txt");

 while((bytesRead=System.in.read(buffer))>=0){

       fos.write(buffer, 0, bytesRead);

- FileOutputStream 클래스는 아래와 같이 7개의 메소드를 갖고있다.

 FileOutputStream 메소드

설명 

 void close() throws IOException

 - OutputStream을 닫는다

 void flush() throws IOException

 - 버퍼에 남은 OutputStream을 출력한다

 void write(int i) throws IOException 

 - 정수 i의 하위 8비트를 출력한다

 void write(byte buffer[]) throws IOException 

 - buffer의 내용을 출력한다

 void write(byte buffer[], int index, int size) throws IOException 

 - buffer의 index 위치부터 size만큼의 바이트를 출력한다

 FileChannel getChannel() 

 - OutputStream과 연관된 유일한 FileChannel 객체를 반환한다.

 FileDescriptor getFD() 

 - OutputStream과 연관된 FileDescriptor 객체를 반환한다 



2.4 FileInputStream 클래스

->파일의 내용을 읽어서 메모리에 저장하는 기능을 수행한다.

- FileInputStream클래스는 아래와 같이 3개의 생성자 메소드를 가진다.

 FileInputStream의 생성자

설명 

 FileInputStream(String filePath) throws IOException

 - filePath로 지정한 파일에 대한 InputStream을 생성 

 FileInputStream(File fileObj) throws IOException

 - fileObj로 지정한 파일에 대한 InputStream을 생성

 FileInputStream(FileDescriptor fdObj) throws IOException

 - fdObj로 기존의 접속을 나타내는 파일 시스템의 InputStream을 생성

*파일의 내용을 메모리에 저장한 후에 출력해보기

   파일의 데이터를 읽음 -> 메모리에 저장 -> 화면에 출력

 int bytesRead;

 byte buffer[] = new byte[256];

 FileInputStream fis = new FileInputStream("test.txt");

 while((bytesRead=fis.read(buffer))>=0){

        System.out.write(buffer, 0, bytesRead);

- FileInputStream 클래스는 아래와 같이 9개의 메소드를 갖고있다.

 FileOutputStream 메소드

설명 

 int available() throws IOException

 - 현재 읽을 수 있는 바이트 수를 반환한다

 int close() throws IOException

 - InputStream을 닫는다 

 int read() throws IOException

 - InputStream에서 한 바이트를 읽어서 int 값으로 반환한다

 int read(byte buffer[]) throws IOException 

 - InputStream에서 buffer[] 크기만큼을 읽어 buffer에 저장하고 읽은 바이트 수를 반환한다 

 int read(byte buffer[], int offset, int numBytes) throws IOException

 - InputStream에서 numBytes만큼을 읽어 buffer[offset]위치에서 부터 저장하고 읽은 바이트 수를 반환한다

 int skip(long numBytes) throws IOException

 - numBytes로 지정된 바이트를 스킵하고 스킵된 바이트 수를 반환한다

 protected void finalize() 

 - 더 이상 참조하는 것이 없을 경우 close() 메소드를 호출한다 

 FileChannel getChannel()

 - FileInputStream의 유일한 FileChannel 객체를 반환한다 

 FileDescriptor getFD() 

 - FileInputStream에서 실제 파일에 접속에 대한 FileDescriptor 객체를 반환한다 

* read()로 데이터를 입력받은 후 char형으로 변환하기

 FileInputStream fis = new FileInputStream(args[0]);

 ind data = 0;

 while((data = fis.read())!=-1){  

         char c=(char)data;   // int -> char 형변환

         System.out.print(c);

 }

 read()의 반환값이 int형(4byte)이긴 하지만, 더 이상 입력값이 없음을 알리는 -1을 제외하고는 0~255(1byte)의 범위의 정수값이기 때문에, char형(2byte)으로 변환한다해도 손실되는 값이 없다.



p28. 연습문제

1. 예제 1.2의 마지막 수행문인 write(b) 메소드를 write(byte[] data, int offset, int length) 메소드로 사용해서 같은 결과를 가지도록 수정하시오.

2. 예제 1.7의 arraycopy() 메소드를 별도의 함수로 직접 작성해서 사용하시오.

->?


4. 키보드로부터 입력한 문자열을 특정한 파일에 저장하고 저장된 파일의 내용을 읽어서 화면에 출력하는 클래스를 작성하시오.


반응형