자바

자바 IO 기반의 입출력과 네트워킹 => IO 패키지 / 입력 스트림, 출력 스트림

알통몬_ 2017. 4. 1. 18:05
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 


일반적인 프로그램이라면 데이터를 외부에서 읽고 다시 외부로 출력하는 작업이 빈번하게 일어납니다.

데이터란 : 사용자로부터 키보드를 통하여 입력이 되거나 파일이나 네트워크 장비로부터도 입력이 될 수 있습니다.

반대로 모니터를 통해 출력 되거나 파일로 출력되어 저장 되거나 네트워크로 출력되어 전송될 수 있습니다.

자바에서는 데이터가 Stream을 통해 입출력 됩니다.

===> 스트림을 잘 알아야겠죠?

스트림이란 : 단일 방향으로 연속적으로 흘러가는 것을 말합니다.



입력 스트림과 출력 스트림

 => 프로그램이 출발지인지 도착지인지에 따라 스트림의 종류가 결정됩니다.

데이터를 입력 받을 때는 입력 스트림, 데이터를 보낼 때는 출력 스트림을 사용합니다.

프로그램을 기준으로 데이터가 들어오면 입력, 나가면 출력입니다.


네트워크 상에서 다른 프로그램과 데이터를 교환하려는 경우는 양쪽 모두에서

입력 스트림과 출력 스트림이 따로 팔요합니다.

그 이유는 스트림은 단방향이기 때문입니다.

자바에서는 java.io 패키지에서 기본 데이터 입출력 API를 제공합니다.


스트림의 종류

- 바이트 기반 스트림 : 이미지, 멀티미디어, 문자 등의 모든 종류의 데이터를 보내고 받을 수 있습니다.

- 문자 기반 스트림 : 문자만 보내고 받을 수 있습니다.


입력 스트림

InputStream

 : 바이트 기반의 입력 스트림의 최상위 클래스이며 추상 클래스입니다.

모든 바이트 기반의 입력 스트림은 InputStream을 상속 받아 만들어집니다.

하위 클래스 -> FileInputStream, BufferedInputStream, DateInputStream


read() : 입력 스트림으로부터 1Byte를 읽고 4Byte 정수 타입으로 리턴합니다.

 => 리턴된 4Byte 중에 1Byte에만 데이터가 들어 있습니다.

예) 3개의 Byte가 들어오면 read() 로 1Byte 씩 3번 읽을 수 있습니다.

* 입력 스트림으로부터 더 이상 읽어올 바이트가 없으면 read()는 -1을 리턴합니다.

==> 읽을 수 있는 마지막 바이트까지 루프를 돌며 1Byte씩 읽을 수 있습니다.

예) 

InputStream inputStream = new FileInputStream("파일의 경로");

int readByte;

byte[] readBytes = new Byte[100];

while( (readByte = inputStream.read(readBytes)) != -1) { ... }


read( byte [] b ) : 입력 스트림으로부터 매개값으로 주어진 바이트 배열의 길이만큼 읽고

바이트를 저장합니다, 읽은 수의 바이트를 리턴합니다.

실제 읽은 바이트 수가 배열의 길이보다 적으면 읽은 수만큼 리턴합니다.

이 메소드도 마찬가지로 입력 스트림으로부터 더 이상 바이트를 읽을 수 없으면 -1을 리턴합니다.


※ 바이트의 양이 많을 땐 read( byte[] b ) 를 사용하는 것이 좋습니다.


read( byte[]b , int off, int len ) : 입력 스트림으로부터 len개 의 바이트만큼 읽고,

매개값으로 주어진 바이트 배열 b[off] 부터 lent까지 저장합니다.

그리고 읽은 수인 len개를 리턴합니다.

실제 읽은 바이트 수가 len 보다 작다면 읽은 수만큼 리턴합니다.

위의 read(), read( byte[] b) 처럼 더 이상 읽을 바이트가 없다면 -1을 리턴합니다.

하지만 read( byte[] b )와의 차이점은 한 번에 읽어들이는 바이트 수를 len 매개값으로 조절할 수 있고,

배열에서 저장이 시작되는 인덱스를 지정 가능합니다.

off를 0으로, lem을 배열의 길이로 주면 read( byte[] b )와 동일하게 동작합니다.


close() : InputStream을 더 이상 사용하지 않을 경우 호출하여 InputStream에서 사용했던 

시스템 자원을 풀어줍니다 => inputStream.close();


다음 포스팅에서는 출력 스트림에 대해 보겠씁니다.

이상입니다.


반응형