개인참고자료/자바(네트워크)

바이트 기반 스트림 - 데이타 전달(PipedInputStream, PipedOutputStream)

경진 2008. 7. 13. 17:40
PipedInputStream과 PipedOutputStream을 이용한 데이타 전달 

import java.io.*;

class ReadThread extends Thread{

  InputStream pi = null;
  OutputStream po = null;    

  ReadThread( InputStream pi, OutputStream po) {
    this.pi = pi;
    this.po = po;
  }

  public void run() {
    int ch;
    int i;
    try {
        for(;;) {
            i = pi.read();
            if (i == -1) { return; }
            po.write(i);
        }
    } catch (Exception e) {  }
  }
}

class SystemStream {

 public static void main( String [] args) {
    try {
      int ch;
      while (true) {
        PipedInputStream  writeIn = new PipedInputStream();
        PipedOutputStream readOut = new PipedOutputStream( writeIn );

        ReadThread rt = new ReadThread( System.in, readOut );
        ReadThread wt = new ReadThread( writeIn, System.out );

        rt.start();
        wt.start();
      }
    } catch (Exception e) {
        System.out.println(e);
    }
  }
}

class ReadThread extends Thread{
……
  ReadThread( InputStream pi, OutputStream po) {
……
  }
  public void run() {
……
  }
}

ReadThread는 Thread 객체며, 생성자는 외부로부터 InputStream과 OutputStream을 받아들인다.
run() 메소드에서 생성자에서 받아들인 InputStream으로부터 읽어 들여 생성자에서 받아들인 OutputStream에게 출력하게 된다.

      while (true) {
        PipedInputStream  writeIn = new PipedInputStream();
        PipedOutputStream readOut = new PipedOutputStream( writeIn );
……

PipedInputStream을 생성한 후, 생성한 객체를 PipedOuutputStream의 생성자에 지정했다.
이 경우, readOut에 있는 출력 메소드를 사용하게 되면, writeIn에서 읽어들일 수 있게 된다.

        ReadThread rt = new ReadThread( System.in, readOut );
        ReadThread wt = new ReadThread( writeIn, System.out );

        rt.start();
        wt.start();

스레드 두 개를 생성한다.
첫번째 스레드는 표준 입력 장치로 부터 입력을 받아 PipedOutputStream readOut을 통해서 출력하는 스레드다.
두번째 스레드는 PipedInputStream 인 writeIn으로부터 읽어 들여 표준 출력 장치에 출력하는 스레드다.
스레드 두 개는 start() 메소드에 의해서 실행되고 키보드로부터 입력 받은 글자는 PipedOutputStream에서 출력하게 된다. 그리고 PipedOutputStream에서 출력한 내용은 PipedInputStream에 의해서 읽혀지게 되어 표준 출력 장치로 출력하게 된다.

실행하면 메모리 부족 오류가 발생한다 나만 그런가?
catch 구문에 OutOfMemoryError 처리를 하면된다. 실행은 정상적으로 되는건지 모르겠다.

COMMAND창에서 실행했다면 종료는 Ctrl + C로하면된다