管道输入输出流 - morris131/morris-book GitHub Wiki
管道输入/输出流和普通的文件输入/输出流或者网络输入/输出流不同之处在于,它主要用于线程之间的数据传输,而传输的媒介为内存。管道输入/输出流主要包括了如下4种具体实现:PipedOutputStream、PipedInputStream、PipedReader和PipedWriter,前两种面向字节,而后两种面向字符。
package com.morris.ch3;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipeByteStream {
public static void main(String[] args) throws IOException, InterruptedException {
PipedInputStream in = new PipedInputStream();
PipedOutputStream out = new PipedOutputStream();
in.connect(out);
new ByteOutputThread(out).start();
Thread.sleep(1000);
new ByteInputThread(in).start();
}
static class ByteOutputThread extends Thread {
private PipedOutputStream out;
ByteOutputThread(PipedOutputStream out) {
this.out = out;
}
@Override
public void run() {
System.out.print("put: ");
try {
for(int i = 0; i < 100; i++) {
String str = i + "";
out.write(str.getBytes());
System.out.print(str);
}
out.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println();
}
}
static class ByteInputThread extends Thread {
private PipedInputStream in;
ByteInputThread(PipedInputStream in) {
this.in = in;
}
@Override
public void run() {
byte[] buffer = new byte[1024];
int len = 0;
try {
while(-1 != (len = in.read(buffer))) {
String data = new String(buffer, 0, len);
System.out.print("read: " + data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
package com.morris.ch3;
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
public class PipeCharactorStream {
public static void main(String[] args) throws IOException, InterruptedException {
PipedWriter writer = new PipedWriter();
PipedReader reader = new PipedReader();
reader.connect(writer);
new CharactorWriterThread(writer).start();
Thread.sleep(1000);
new CharactorReaderThread(reader).start();
}
static class CharactorWriterThread extends Thread {
private PipedWriter writer;
CharactorWriterThread(PipedWriter writer) {
this.writer = writer;
}
@Override
public void run() {
System.out.print("put: ");
try {
for (int i = 0; i < 100; i++) {
String str = i + "";
writer.write(str);
System.out.print(str);
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println();
}
}
static class CharactorReaderThread extends Thread {
private PipedReader reader;
CharactorReaderThread(PipedReader reader) {
this.reader = reader;
}
@Override
public void run() {
char[] buffer = new char[1024];
int len = 0;
try {
while (-1 != (len = reader.read(buffer))) {
String data = new String(buffer, 0, len);
System.out.print("read: " + data);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}