パイプ入力フローPipedInputStream

2043 ワード

パイプ入力ストリームは、パイプ出力ストリームからデータを読み出します.通常、1つのスレッドからパイプにストリーム書き込みデータが出力され、別のスレッドからパイプ入力ストリームからデータが読み出され、2つのスレッドはパイプで通信することができる.スレッドAがパイプ入力ストリームのread()メソッドを実行すると、一時的にデータがない場合、このスレッドはブロックされ、スレッドBがパイプにストリームを出力して新しいデータを書いた場合にのみ、スレッドAが実行を再開します.次に例を示します
Senderクラス

package xiaohang.com;

import java.io.PipedOutputStream;

/**              */
class Sender extends Thread {
	private PipedOutputStream out = new PipedOutputStream();

	public PipedOutputStream getPipedOutputStream() {
		return out;
	}

	@Override
	public void run() {
		try {
			for (int i = -127; i < 128; i++) {
				out.write(i);
				//                  
				yield();
			}
			//                                      。
			out.close();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

Receiverクラス

package xiaohang.com;

import java.io.IOException;
import java.io.PipedInputStream;

/**               */
public class Receiver extends Thread {
	private PipedInputStream in;

	public Receiver(Sender sender) throws IOException {
		//                 PipedOutputStream                      ,   
		// IOException
		in = new PipedInputStream(sender.getPipedOutputStream());
	}

	@Override
	public void run() {
		try {
			int data;
			while ((data = in.read()) != -1)
				System.out.println(data);
			in.close();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public static void main(String args[]) throws Exception {
		Sender sender = new Sender();
		Receiver receiver = new Receiver(sender);
		sender.start();
		receiver.start();
	}
}

スレッドSenderはパイプ出力ストリームにバイトを書き込み、スレッドReceiverはパイプ入力ストリームからバイトを読み出す.スレッドSenderが出力するバイトシーケンスは、スレッドReceiverが読み込んだバイトシーケンスと同じです.