JAvaベースのIOストリーム--PipedOutputStream(マルチスレッド技術に関するパイプストリーム、比較的特殊)

2565 ワード

パイプフロー:パイプは一方がデータを読み、他方がデータを書き、これはマルチスレッドの問題に関連し、どのように読取の一貫性を保証するか
パイプ入力ストリームはパイプ出力ストリームに接続する必要があります.パイプ入力ストリームは、パイプ出力ストリームに書き込むすべてのデータバイトを提供します.通常、データは、あるスレッドによってPipedInputStreamオブジェクトから読み込まれ、他のスレッドによって対応するPipedOutputStreamに書き込まれます.この2つのオブジェクトに対して単一のスレッドを使用することは推奨されません.これは、スレッドがデッドロックする可能性があるためです.パイプ入力ストリームには、バッファによって定義された範囲内で読み取り操作と書き込み操作を分離できるバッファが含まれます.接続パイプ出力ストリームにデータバイトを供給するスレッドが存在しない場合は、パイプが破損しているとみなされます. 
パイプ入力フローとパイプ出力フローを結合するにはどうすればいいですか?
1つ目の方法:パイプ入力フローの構造関数を使用する
PipedInputStream(PipedOutputStream src)            PipedInputStreamを作成し、パイプ出力ストリームsrcに接続します.
第2の方法:パイプ入力フローを使用するconnect方法
connect(PipedOutputStream src)            このパイプ入力ストリームをパイプ出力ストリームsrcに接続します.
package newFeatures8;

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

public class PipedIODemo{
	public static void main(String[] args) throws IOException {
		PipedInputStream in=new PipedInputStream();
		PipedOutputStream out=new PipedOutputStream();
		in.connect(out);
		
		Read read=new Read(in);
		Write write=new Write(out);
		//    cup       
		new Thread(read).start();
		new Thread(write).start();
	}

	
}

class Read implements Runnable{
    private  PipedInputStream in;
    public Read(PipedInputStream in){
    	if (in!=null) {
    		this.in=in;
		}else{
			throw new NullPointerException("      ");
		}
    	
    }
	@Override
	public void run() {
		try {
			byte[] buf=new byte[1024];//1k:512  
			System.out.println("          ");
			int len=in.read(buf);
			System.out.println("        !");
			//       
			//                ,         
			String content=new String(buf,0,len);
			System.out.println(content);
		} catch (Exception e) {
			 throw new RuntimeException("       ");
		}finally {
			try {
				if(in!=null)
				   in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
}

class Write implements Runnable{
    private  PipedOutputStream out;
    public Write(PipedOutputStream out){
    	if (out!=null) {
    		this.out=out;
		}else{
			throw new NullPointerException("      ");
		}
    	
    }
	@Override
	public void run() {
		try {
			System.out.println("      ,  6  ");
			Thread.sleep(6000);
			//  :           ?                
			out.write("piped lai la".getBytes());
		} catch (Exception e) {
			 throw new RuntimeException("       ");
		}finally {
			try {
				if(out!=null)
					out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
	
}