바이트 기반의 데이터를 읽고,쓰는데 사용하는 스트림의 기본은 InputStream,

OutputStream입니다.

InputStream은 자바에서 가장 기본이 되는 읽는 기능에 관한 클래스입니다.

가장 기본이 되는 읽는 기능이라고 한 이유는 자바에서 바이트 스트림 계열의 모든 읽기

클래스는 InputStream 클래스를 상속했기 때문에 InputStream에서 제공하는 메소드는 그야

말로 모든 읽기 클래스에서 사용할 수 있는 기본중의 기본이 되는 메소드입니다.

InputStream은 추상클래스로 설계되었으므로 new 생성자와 어울려서 new InputStream()

등과 같이 객체를 만들어 낼 수는 없습니다.

InputStream 8비트로 구성된 바이트를 읽고,쓰는데 사용되는 스트림입니다.

보통 InputStream,OutputStream등의 바이트 기반의 읽기,쓰기 클래스는 바이너리 데이터,

이미지나, 사운드 등의 데이터등을 읽고,쓸 때 많이 사용됩니다.

소켓을 통한 네트워크 연결 후에 얻어 지는 것이 바로 InputStream,OutputStream이어서

네트워크 프로그램에서 많이 사용되기도 합니다.

6 - 1 InputStream클래스에서 선언한 메소들입니다.

 

InputStream

int available()

스트림으로부터 지금 당장 읽을 수 있는 바이트가

몇 바이트인지 알아봅니다.

스트림으로부터 당장 읽을 수 있는 바이트의 수

int close()

스트림을 닫고, 스트림과 결합되어있는 시스템 리소스를

풀어줍니다.

int mark(int readlimit)          

스트림에서 현재의 위치를 표시합니다.

boolean markSupported()

스트림이 mark(int readlimit)를 지원하는지 검사합니다

스트림이 mark(int readlimt)를 지원하면 true

그외 false

abstract int read()       

스트림으로부터 한 바이트 읽습니다.

스트림으로부터 읽은 바이트

int read(byte[] b)        

스트림으로 부터 바이트를 읽어들여서 바이트 배열 b

저장합니다

스트림으로부터 읽은 바이트 수

int read(byte[] b, int off, int len)

스트림으로 부터 len 바이트를 읽어,배열 b off번째

위치에부터 저장합니다.

스트림으로부터 읽은 바이트 수

void reset()

스트림의 다음에 읽을 위치를 마지막 mark(int readlimit)

를 호출했을때로 이동시킵니다.

long skip(long n)

스트림으로부터 n바이트를 건너뜁니다.

6 - 1

6 - 1에 나열된 메소드는 이후에 나타나게 될 많고 많은 InputStream 에서도

그대로 사용할 수 있습니다. 6 - 1에 있는 메소드들은 자바의 모든 바이트기반 읽기

클래스에서 사용할 수 있는 기본 메소드입니다. 

그리고 표 6 - 1의 기본메소드 중에도 기본인 것이 바로 read 메소드 3가지 입니다.

 

 

OutputStream

void close()

스트림을 닫고, 스트림과 결합되어있는 시스템 리소스를

풀어줍니다

void flush()

아직 쓰지 않은 데이타를 스트림으로 쓰게 합니다.

void write(byte[] b)

바이트 배열 b의 바이트를 스트림으로 씁니다.

void write(byte[] b,int off, int len)

바이트 배열 b의 바이트를 off위치부터 len길이만큼만

스트림에 씁니다.

void abstract  void write(int b)

수형 b를 스트림으로 쓰게 합니다.

6 - 2

 

6 - 2 OutputStream은 자바에서 가장 기본이 되는 쓰기 관련 클래스입니다.

가장 기본이 되는 쓰는 기능이라고 한 이유는 자바에서 바이트 스트림 계열의 모든 쓰기

클래스는 OutputStream을 상속 했기 때문에 OutputStream에서 제공하는 메소드는 그야

말로 바이트 스트림 계열의 모든 곳에서 사용할 수 있는 기본중의 기본입니다.

 

import java.io.*;

import java.net.*;

/**

* InputStream의 기능을 보여줍니다.

*/

public class InputStreamDemo  {

             public static void main(String[] args){

                           try {

                                        // World Time Server로 네트워크 연결

                                        Socket s = new Socket("132.163.4.101",13);

 

                                        // 네트워크로부터 만든 InputStream

                                        InputStream is = s.getInputStream();  

                                        int c = 0;

                                        while((c = is.read()) != -1) {             // InputStream으로 읽기

                                                     System.out.write(c);                         // System.out OutputStream으로 쓰기

                                        }

                                        is.close();            // InputStream 자원 해제

                           }

                           catch(UnknownHostException uhe) {

                                        uhe.printStackTrace();

                           }

                           catch(IOException ie) {

                                        ie.printStackTrace();

                           }

             }

}

예제 6 - 3 InputStreamDemo.java

 

예제 6 - 3 World Time Server에 네트워크로 연결한다음, InputStream을 만들고

InputStream으로부터 읽은 데이터를 표준출력으로 내보내고 있습니다.

예제 6 - 3의 입출력관련된 메소드를 살펴보면 InputStream read()메소드와

OutputStream write()메소드를 사용하고 있는 것을 볼수 있는데, 이런 모양새는

InputStream이 네트워크 연결로부터 얻어진 것이 아니어도 OutputStream

표준출력이 아니더라도 상관없이 동일하게 사용됩니다.

, OutputStream이 만약 File로부터 얻어진 것이라면 World Time Server로부터 읽어온

시간정보가 표준출력으로 쓰여지지 않고, File로 쓰여졌을 것입니다.

물론 InputStream, OutputStream을 이용한 메소드에는 전혀 변화가 없습니다.

아주 간명하지요?

 

사용자 삽입 이미지
 그림 6 - 3 [ run InputStreamDemo]

 

Posted by
,