4.Java IO-管道

来源:互联网 发布:淘宝怎么买原味内衣 编辑:程序博客网 时间:2024/06/16 02:45

本文是在Java IO: Pipes翻译而来。欢迎大家联系我,跟我一起交流。本人水平有限,如果错误欢迎指正。

管道给予同一个java虚拟机中两个线程通信的能力。所以管道也是数据的输入源和输出目标。

你可以用管道与不同java虚拟机(不同线程)中的线程通信。java中管道的概念和Unix/Linux中管道的概念是有区别的。jiava中,通信双方必须在同一个进程中,而且还是不一样的线程。

通过Java IO创建管道

通过java IO的管道输出流类(PipedOutputStream )和管道输入流类(PipedInputStream ) 。通过一个线程将数据写入管道输入流,然后可以由另一个线程从管道输出流中读取数据。

Java 管道例子

下面是一个简单的例子,如何将管道输入流连接到管道输出流:

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()方法连接俩个管道流。管道输出流和管道输入流都有connect()方法,这个方法用来相互连接。

管道和线程

记住,当运用俩个已连接的管道流,将一个流交给一个线程,另一个流交给另一个线程。在流上调用read()和write()阻塞了,意味着如果你在同一个线程中又读又写,这有可能导致线程自己死锁。

管道替代者

比起管道,有很多其他的方式可以在同一个java虚拟机中线程间通信。实际上,线程间大部分交换的是完整的对象,而不是交换原始字节数据。但是如果你需要在进程间交换原始字节数据,Java IO管道是可以用的。

0 0
原创粉丝点击