[네트워크 프로그래밍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. 키보드로부터 입력한 문자열을 특정한 파일에 저장하고 저장된 파일의 내용을 읽어서 화면에 출력하는 클래스를 작성하시오.
'삶의 늪에 들어 가기 전 > 정리중(미정리)' 카테고리의 다른 글
[네트워크 프로그래밍1]파일 처리 클래스 정리 (0) | 2015.04.14 |
---|---|
[네트워크 프로그래밍1]필터 입출력 스트림 정리 (0) | 2015.04.12 |
봄 노래 리스트 (0) | 2015.04.10 |
[네트워크 프로그래밍1]텍스트 파일 생성(java, 이어쓰기, 입출력) (0) | 2015.04.08 |
[객체지향 윈도우즈 프로그래밍]C학습향상스터디-최종 소책자 만들기 (0) | 2015.04.08 |