標籤:style blog color java 使用 os io for
管道流(線程通訊流):管道流的主要作用是可以進行兩個線程間的通訊,分為管道輸出資料流(PipedOutputStream)、管道輸入資料流(PipedInputStream),如果想要進行管道輸出,則必須要把輸出資料流連在輸入資料流之上。:
1.管道輸入資料流應該串連到管道輸出資料流 ,輸入資料流和輸出資料流可以直接連接
2.使用多線程操作,結合線程進行操作。通常由某個線程從管道輸入資料流中(PipedInputStream)對象讀取。
並由其他線程將其寫入到相應的端到輸出資料流中。不能使用單線程對輸入資料流對象向和輸出資料流對象進行操作,因為會造成 死結問題。
3.管道流串連:(1)使用構造方法進行串連PipedOutputStream(PipedInputStream snk) 建立串連到指定管道輸入資料流的管道輸出資料流。
(2)public void connect(PipedInputStream snk)throws IOException,使用connect方法進行串連
下面看代碼:
package com.lp.ecjtu.io.piped;import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutputStream;public class PipedDemo { public static void main(String[] args) { PipedOutputStream out = new PipedOutputStream(); PipedInputStream in = new PipedInputStream(); try { out.connect(in); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }//輸出管道流串連輸入管道流 new Thread(new OutputThread(out)).start(); new Thread(new InputThread(in)).start(); }}class InputThread implements Runnable{ private PipedInputStream in; public InputThread(PipedInputStream in){ this.in = in; } @Override public void run() { // TODO Auto-generated method stub try { byte[] buff = new byte[1024]; int len = in.read(buff); String s = new String(buff,0,len); System.out.println(s); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}class OutputThread implements Runnable{ private PipedOutputStream out; public OutputThread(PipedOutputStream out){ this.out = out; } @Override public void run() { String str = "hello Piped!"; try { out.write(str.getBytes()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { if(out != null){ out.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}