Java 에서 Piped Stream을 사용하는 예
PipedReader, PipedWriter 는 마치 파이프의 양단처럼 서로 연결되어 사용되는 스트림이다.
PipedWriter에서 문자열을 출력하면 PipedReader 에서 읽어 들일 수 있도록 작동한다.
특히 다수개의 쓰레드가 사용되는 프로그램에서 쓰레드 간에 상태를 전달하고 받는 용도로 매우 유용하게 사용되고 있다.
그러므로 이들 2개 스트림은 서로 연결될 필요가 있는데, 생성자를 사용해서 상대방 스트림을 연결하는 방법과 connect() 메소드를 사용해서 연결하는 방법이 있다. 아래의 예제에서는 생성자를 통해서 서로 연결되는 방법을 사용하였다
PipedWriter pw = new PipedWriter(pr);
위와 같이 연결된 경우, pw.write() 를 이용해 문자열을 출력하면 pr.read()를 통해 읽어 올 수 있다
package org.kdea.stream; import java.io.*; public class PipedStreamMain { public static void main(String[] args) { PipedReader pr = new PipedReader(); PipedWriter pw = null; try { pw = new PipedWriter(pr); } catch (IOException e) { e.printStackTrace(); } Thread t1 = new Thread1(pw); Thread t2 = new Thread2(pr); t2.start(); t1.start(); } } class Thread1 extends Thread { PipedWriter pWriter; public Thread1(PipedWriter pWriter) { this.pWriter = pWriter; } @Override public void run() { PrintWriter pw = new PrintWriter(pWriter); pw.println("loginFail"); //pw.println("loginOK"); pw.flush(); } } class Thread2 extends Thread { PipedReader pReader; public Thread2(PipedReader pReader) { this.pReader = pReader; } @Override public void run() { BufferedReader br = new BufferedReader(pReader); String pMsg; try { pMsg = br.readLine(); if(pMsg.equals("loginFail")) { System.out.println("로그인에 실패했으므로 쓰레드가 실행되지 않습니다"); return; } } catch (IOException e) { e.printStackTrace(); } System.out.println("로그인에 성공했으므로 쓰레드가 정상적으로 실행됩니다"); for(int i=0;i<10;i++) { System.out.printf("%d ",i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }