举报投诉联系我们 手机版 热门标签 名动网
您的位置:名动网 > java管道流 Java 管道

java管道流 Java 管道

2023-04-29 04:20 Java教程

java管道流 Java 管道

java管道流

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异常。

Java 管道

Java IO教程 - Java管道


管道连接输入流和输出流。

管道 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管道流 Java 管道全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 名动网 mdwl.vip 版权所有 联系我们