Java IO:管道
时间:2020-01-09 10:36:05 来源:igfitidea点击:
Java IO中的管道使运行在同一JVM中的两个线程能够进行通信。因此,管道也可以是数据的源或者目的地。
我们不能使用管道与其他JVM(不同的进程)中的线程进行通信。 Java中的管道概念不同于Unix / Linux中的管道概念,在Unix / Linux中,运行在不同地址空间中的两个进程可以通过管道进行通信。在Java中,通信方必须在同一进程中运行,并且应该是不同的线程。
通过Java IO创建管道
使用Java IO创建管道是通过" PipedOutputStream"和" PipedInputStream"类完成的。一个" PipedInputStream"应该连接到一个" PipedOutputStream"。一个线程写入" PipedOutputStream"的数据可以被另一个线程从连接的" PipedInputStream"中读取。
Java IO管道示例
这是一个简单的示例,说明如何将" PipedInputStream"连接到" PipedOutputStream":
import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; public class PipeExample { public static void main(String[] args) throws IOException { final PipedOutputStream output = new PipedOutputStream(); final PipedInputStream input = new PipedInputStream(output); Thread thread1 = new Thread(new Runnable() { @Override public void run() { try { output.write("Hello world, pipe!".getBytes()); } catch (IOException e) { } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { int data = input.read(); while(data != -1){ System.out.print((char) data); data = input.read(); } } catch (IOException e) { } } }); thread1.start(); thread2.start(); } }
我们还可以使用它们的connect()方法连接两个管道流。 PipedInputStream和PipedOutputStream都有一个connect()方法,可以将一个连接到另一个。
管道和螺纹
记住,当使用两个连接的管道流时,将一个流传递给一个线程,将另一个流传递给另一个线程。流上的read()
和write()
调用被阻塞,这意味着如果我们尝试使用同一线程进行读写,则可能导致线程自身死锁。
管道替代
除了管道外,还有许多其他方法可以使线程在同一JVM中进行通信。实际上,线程更经常交换完整的对象,而不是原始字节数据。但是,如果我们需要在线程之间交换原始字节数据,则可以使用Java IO的管道。