在java.io包中的PipeStream管道流用于在線程之間傳送數據.一個線程發送數據到輸出管道,另外一個線程從輸入管道中讀取數據.相關的類包括: PipedInputStream和PipedOutputStream, PipedReader和PipedWriter。
package com.wkcto.pipestream;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
/**
* 使用PipedInputStream和PipedOutputStream管道字節流在線程之間傳遞數據
* 北京動力節點老崔
*/
public class Test {
public static void main(String[] args) throws IOException {
//定義管道字節流
PipedInputStream inputStream = new PipedInputStream();
PipedOutputStream outputStream = new PipedOutputStream();
//在輸入管道流與輸出管道流之間建立連接
inputStream.connect(outputStream);
//創建線程向管道流中寫入數據
new Thread(new Runnable() {
@Override
public void run() {
writeData(outputStream);
}
}).start();
//定義線程從管道流讀取數據
new Thread(new Runnable() {
@Override
public void run() {
readData(inputStream);
}
}).start();
}
//定義方法向管道流中寫入數據
public static void writeData(PipedOutputStream out ){
try {
//分別把0~100之間的數寫入管道中
for (int i = 0; i < 100; i++) {
String data = "" + i;
out.write( data.getBytes() ); //把字節數組寫入到輸出管道流中
}
out.close(); //關閉管道流
} catch (IOException e) {
e.printStackTrace();
}
}
//定義方法從管道流中讀取數據
public static void readData(PipedInputStream in ){
byte[] bytes = new byte[1024];
try {
//從管道輸入字節流中讀取字節保存到字節數組中
int len = in.read(bytes); //返回讀到的字節數,如果沒有讀到任何數據返回-1
while ( len != -1 ){
//把bytes數組中從0開始講到的len個字節轉換為字符串打印
System.out.println( new String(bytes, 0 , len));
len = in.read(bytes); //繼續從管道中讀取數據
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.wkcto.pipestream;
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
import java.io.PrintWriter;
/**
* PipedReader與PipedWriter字符管道流
* 北京動力節點老崔
*/
public class Test2 {
public static void main(String[] args) throws IOException {
//先創建字符管道流
PipedReader reader = new PipedReader();
PipedWriter writer = new PipedWriter();
//在輸入管道流與輸出管道流之間建立連接
reader.connect(writer);
//創建一個線程向管道流中穿入數據
new Thread(new Runnable() {
@Override
public void run() {
try {
for (int i = 0; i < 100; i++) {
writer.write( "data--" + i + "--" + Math.random() + "\n");
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
//開啟另外一個 線程從管道流中讀取數據
new Thread(new Runnable() {
@Override
public void run() {
char [] charArray = new char[1024];
try {
int len = reader.read(charArray);
while (len != -1 ){
System.out.print( String.valueOf(charArray, 0, len));
len = reader.read(charArray);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}