管道输入输出流 - 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();
			}
		}
	}

}
⚠️ **GitHub.com Fallback** ⚠️