Java管道流是Java IO流的一种,它可以将两个线程之间的数据进行交换。它是一种半双工的流,其中一个线程可以向流中写入数据,而另一个线程可以从流中读取数据。它使用了“字节”作为数据传输的单位,因此它通常用于传输文本或二进制数据。
Java 管道流有两种形式:字节流和字符流。字节流用于传输原始字节数据(例如图像文件或音频文件),而字符流用于传输文本数据。
PipedInputStream in = new PipedInputStream(); // 创建一个PipedInputStream对象 PipedOutputStream out = new PipedOutputStream(in); // 创建一个PipedOutputStream对象
上面代码创建了一个PipedInputStream对象in和一个PipedOutputStream对象out。在创建PipedOutputStream时,必须将其关联到一个PipedInputStream对象上(在这里是in)。这样就形成了一条通信通道。
out.write(data); // 向通道中写入数据 int data = in.read(); // 从通道中读取数据
上面代码向通道中写入数据data(使用write()方法)并从通道中读取数据data (使用read()方法)。在写入之前必须保证通道已打开并准备好写入数据。否则将会出现IOException异常。
管道连接输入流和输出流。
管道 I/O基于生产者 - 消费者模式,其中生产者产生数据并且消费者消费数据。
在管道 I/O中,我们创建两个流代表管道的两端。 PipedOutputStream对象表示一端,PipedInputStream对象表示另一端。我们使用两个对象上的connect()方法连接两端。
我们还可以通过在创建另一个对象时将一个对象传递给构造函数来连接它们。
以下代码显示了创建和连接管道两端的两种方法:
第一种方法创建管道输入和输出流并连接它们。它使用connect方法连接两个流。
PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(); pis.connect(pos);
第二种方法创建管道输入和输出流并连接它们。它通过将输入管道流传递到输出流构造器来连接两个流。
PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(pis);
我们可以在连接管道的两端后生成和使用数据。
我们通过使用PipedOutputStream对象的一个write()方法产生数据。无论我们对管道输出流写入什么,自动变得可用于管道输入流对象进行读取。
我们使用PipedInputStream的read()方法从管道读取数据。如果数据在尝试从管道读取时不可用,则管道输入流被阻止。
管道流具有固定容量的缓冲器,以在写入管道和从管道读取之间存储数据。
我们可以设置管道容量,当我们创建它。如果管道的缓冲区已满,则尝试在管道上写入将被阻止。
以下代码创建缓冲区容量为2048字节的管道输入和输出流。
PipedOutputStream pos = new PipedOutputStream(); PipedInputStream pis = new PipedInputStream(pos, 2048);
管道用于将数据从一个线程传输到另一个线程。两个线程之间的同步由阻塞读和写来处理。
以下代码演示了如何使用管道 I/O。
import java.io.PipedInputStream; import java.io.PipedOutputStream; public class Main { public static void main(String[] args) throws Exception { PipedInputStream pis = new PipedInputStream(); PipedOutputStream pos = new PipedOutputStream(); pos.connect(pis); Runnable producer = () -> produceData(pos); Runnable consumer = () -> consumeData(pis); new Thread(producer).start(); new Thread(consumer).start(); } public static void produceData(PipedOutputStream pos) { try { for (int i = 1; i <= 50; i++) { pos.write((byte) i); pos.flush(); System.out.println("Writing: " + i); Thread.sleep(500); } pos.close(); } catch (Exception e) { e.printStackTrace(); } } public static void consumeData(PipedInputStream pis) { try { int num = -1; while ((num = pis.read()) != -1) { System.out.println("Reading: " + num); } pis.close(); } catch (Exception e) { e.printStackTrace(); } } }
上面的代码生成以下结果。
Java isLetter() 方法Java Character类isLetter() 方法用于判断指定字符是否为字母。语法boolean isLetter(char ch)参数ch -- 要...
Java数据类型教程 -Java多维数组我们可以在二维数组中存储表格数据。使用数组声明中每个维度的一对括号[]来声明多维数组。例如,...
Java数据类型教程 -Java short数据类型short数据类型是16位有符号Java原语整数数据类型。 其范围是-32768至32767(或-215 15 -1)...
Java数据类型教程 -Java下划线数字字面量我们可以在数字字面量中的两位数字之间使用下划线。例如,一个int文字2014可以写成2_014...