본문 바로가기

BackEnd/Java

I/O 인풋, 아웃풋에 대한 이해

1.  I/O 모델과 스트림(Stream)


1) 스트림에 대한 이해


I/O 모델의 핵심은 스트림을 이해하는데 있다. 스트림이란 ‘데이터의 흐름’,또는 ‘데이


터의 흐름을 형성해 주는 통로’를 의미한다. 자바에서도 이러한 의미로 스트림이 인식되지


만,파일 또는 각종 I/O 장치와의 데이터 이동에 사용되는 인스턴스를 의미하는 용도로도 


사용이 된다. 


즉 어떤 I/O관련 클래스의 인스터스가 스트림인것이다.


이 스트림이라는것은 byte의 나열을 의미한다. 


데이터의 흐름이 단방향이다.


그래서 입력과 출력을 동시에 진행할려면 입력용, 출력용 스트림을 둘다 생성해야한다.



2) 스트림의 종류



- Input Stream(인풋 스트림이라는 클래스)



프로그램으로 데이터를 읽어 들이는 스트림


프로그램으로 데이터를 읽어 들여야 하는 상황이라면, 입력 스트림을 형성해야 한다. 


InputStream 클래스는 바이트 단위로 데이터를 읽어 들이는 모든 입력 스트림이 상속하


는 최상위 클래스이다(Object 클래스 다음으로). 그리고 이 클래스에서 정의하고 있는 


대표적인 메소드 두 가지는 다음과 같다. 


• public abstract int read() throws IOException 


read 메소드는 1 바이트의 데이터를 읽어서 반환하는 메소드


• public void close() throws IOException


데이터를 읽어 들이는 과정이 끝났다면,생성했던 스트림은 소멸해야 한다. 그래


야 가상머신이 할당했던 각종 리소스들이 메모리상에서 지워지기 때문이다



예시) FilelnputStream은 InputStream 클래스를 상속한다. 그리고 파일을 대상으로 하는


입력 스트림의 형성을 위한 클래스이다.


따라서 파일로부터 데이터를 1바이트씩 읽어 들이려면 다음과 같이 코드를 구성한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
InputStream in=new FileInputStream("run.exe"); 
 
while(true) { 
 
int bData=in.read(); 
 
if(bData == -1break
 
....
 
}
 
in.close(); // 입력 스트림 소멸
cs



- Output Stream(아웃풋 스트림이라는 클래스)


프로그램으로부터 데이터를 내보내는 스트림


반면 프로그램으로부터 데이터를 전송해야 하는 상황이라면,


출력 스트림을 형성해야 한다. 


OutputStream의 대표적인 메소드 둘은 다음과 같다


• public abstract void write(int b) throws IOException 


• public void close() throws IOException


참고로 write는 인자로 전달된 1바이트 데이터를 출력 스트림을 통해 목적지로 전달하


는 메소드이다. 그런데 매개변수는 int형으로 선언되었다. 따라서 매개변수로 전달된 4


바이트 데이터 중 하위 1바이트만 전달 되고,상위 3바이트는 그냥 무시되어 버린다.