web developer

[java] InputStream와 OutputStream의 개념 본문

Language/Java

[java] InputStream와 OutputStream의 개념

trueman 2022. 9. 7. 00:31
728x90
728x90

1. 스트림과 바이트 스트림의 개념


1) 스트림

· 인간이 사용하는 문자는 이진수로 컴퓨터에게 전달된다.

· 문자 뿐만 아니라 이미지, 동영상, 소리도 이진수로 인코딩된다. 

· 데이터는 이진수의 나열로 바뀌는데 이진수의 흐름을 바이트 단위로 읽어들인다.

· 이러한 흐름을 스트림(Stream)이라 한다.


2) 바이트 스트림

· 바이트 스트림은 1 byte를 입출력 할 수 있는 스트림(흐름) 입니다.
· 자바에서 입·출력 스트림을 통해 흘러가는 데이터의 기본 단위입니다.
· 일반적으로 바이트로 구성된 파일, 즉 동영상 파일, 이미지 파일, 음악 파일을 처리하기에 적합한 스트림입니다.


2. 바이트 스트림 계층구조


자바의 출력 바이트 스트림의 기본 클래스가 되는 이 클래스는 추상클래스입니다.

즉 객체를 생성하진 못하지만 하위 클래스를 이용해서 상속을 받아서 사용하는 방식이 되며, 하위 클래스는 write, flush, 그리고 close를 정의를 합니다.

바이트 스트림의 계층 구조


Java.io 패키지는 다음과 같습니다.

 

자바의 기본적인 데이터 입출력은 Java.io 패키지에서 제공함. Java.io 패키지에서는 파일 시스템의 정보를 얻기 위한 File클래스와 데이터를 입출력하기 위한 다양한 입출력 스트림 클래스를 제공합니다.

 

바이트 단위 입출력 스트림 클래스
  • 바이트 단위 입출력을 위한 최상위 스트림 클래스 : InputStream, OutputStream
  • 바이트 단위 입출력을 위한 하위 스트림 클래스  : FileInputStream, FileOutputStream
문자 단위 입출력 스트림 클래스
  • 문자 단위 입출력을 위한 최상위 입출력 스트림 클래스 : Reader, Writer
  • 문자 단위 입출력을 위한 하위 스트림 클래스 : FileReader, FileWriter, InputStreamReader, OutputStreamWriter, PinterWriter
그 이외의 스트림 클래스
  • 파일 시스템의 파일 정보를 얻기 위한 클래스 : File
  • 콘솔로부터 문자를 입출력하기 위한 클래스 :  Console

 3. InputStream와 OutputStream의 개념


1) InputStream


  • int available() : 현재 읽을 수 있는 바이트 수를 반환한다.
  • void close() : 입력 스트림을 닫기
  • int read() : 한 바이트를 읽어 int 형으로 반환, 더 이상 읽을 값이 없다면 -1을 반환
  • int read(byte buffer[]) : buffer의 크기만큼 읽어 buffer에 저장하고 읽은 바이트 수를 반환
  • int read(byte buffer[], int offset, int numBytes) : numbytes 만큼을 읽어 buffer의 offset 위치에 저장하고 읽은 바이트 수를 반환
  • int skip(long numBytes) : numBytes로 지정된 바이트를 건너뛰고 건너 뛴 바이트 수를 반환
  • void mark(int numBytes) : mark()와 reset()를 지원하면 true를 반환
  • void reset() : 입력 시작 부분을 현재의 위치에서 가장 가까운 이전의 마크 위치로 설정

2) OutputStream


  • void close() : OutputStream을 닫는다.
  • void flush() : 버퍼에 남아있는 출력 스트림을 출력한다.
  • void write(byte[] b) : 버퍼의 내용을 출력한다.
  • void write(byte[] b, int off, int len) : b배열 안에 있는 시작 off부터 len만큼 출력한다.
  • abstract void write(int b) : 정수 b의 하위 1바이트를 출력한다

4. write 메소드


void write(int b);

write 메서드는 바이트 스트림임에도 불구하고 int를 인자로 받고있음을 확인할 수 있다. 이는 출력 대상은 int지만 실제로는 하위 8개의 비트(이 때 이 바이트는 unsigned로 사용한다.)를 인자로 받아서 출력 대상에 쓰며, 0~255의 범위의 정수만 출력을 한다. 만약 255보다 큰 숫자를 입력하게 된다면 하위 1바이트만 인식하고 상위 3바이트는 무시를 해버린다.

 

void write(byte[] data);
void write(byte[] data, int offset, int length);   // offset부터 length만큼 출력

또한, 출력이 하나의 바이트가 아닌 바이트 배열을 입력받으며, 1회의 write로 여러개의 바이트를 출력이 가능함을 확인할 수 있다.


실제로 데이터를 출력할 때는 OutputStream이 아니라 구체적인 스트림을 사용해야한다. 이 클래스는 다음과 같다.

FileOutputStream // 파일을 출력할 때
TelnetOutputStream // 네트워크에 출력할 때
ByteArrayOutputStream // 바이트 배열에 출력할 때

5. FileStream 클래스


파일을 출력하고 싶다면 File클래스를 FileOutputStream에 전달해서 사용을 한다.

생성자는 다음과 같다.

FileOutputStream(File file) throws FileNotFoundException

 

그 이후 write 메서드를 사용을 하면 된다.


 

출처 :  https://develop-im.tistory.com/54 

출처 : https://bamdule.tistory.com/179

출처 : https://m.blog.naver.com/cscculture/222084125558 

728x90
728x90
Comments