系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream
2024-08-27 00:55:55
PipedInputStream 类使得可以作为字节流读取管道的内容。 管道是同一 JVM 内的线程之间的通信通道。
使用两个已连接的管道流时,要为每个流操作创建一个线程,
read() 和 write() 都是阻塞方法,如果一个线程同时读写就会造成死锁
看一个例子:
public class Pipe {
public static void main(String[] args) throws IOException {
final PipedOutputStream output = new PipedOutputStream();
final PipedInputStream input = new PipedInputStream(output);
// 写线程,创建匿名 Runnable 对象
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
try {
output.write("Hello Pipe".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
});
// 读线程,用一下 Lambda 表达式创建匿名 Runnable 对象
Thread thread2 = new Thread(() -> {
try {
int data = input.read();
while (data != -1) {
System.out.print((char) data);
data = input.read();
}
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
}
);
thread1.start();
thread2.start();
}
}
这里通过利用构造方法来直接指定管道输入流的管道输出流。
PipedInputStream input = new PipedInputStream(output);
也可以使用 pipe1.connect(pipe2) 来连接两个管道流,例如:
PipedInputStream pis = new PipedInputStream(); pis.connect(pos);
除了管道之外,还有许多其他方法可以在同一个 JVM 中进行通信。
事实上,线程更经常交换完整的对象而不是原始的字节数据。
但是如果需要在线程之间交换原始字节数据,Java IO 的管道是能做到的。
最新文章
- ASP.NET MVC项目实践技巧
- Loadrunner,将http请求返回的中文结果打印出来
- 意译:《JVM Internals》
- Windows、Linux下文件操作(写、删除)错误的产生原因、及解决方法
- C语言(4)
- php函数、php定义数组和数组遍历
- 3D语音天气球(源码分享)——创建可旋转的3D球
- Bochs使用说明
- hdu4081 次小生成树变形
- win7 cmd命令行窗口 宽度无法变大 自由调整大小
- sql plus 抢救数据(測)
- python 三层架构说明
- Canvas: 优雅的代码作图系列:中国国旗
- Zabbix配置邮件监控
- Spring容器技术内幕之BeanWrapper类介绍
- async_retrying
- vue 异步请求
- 如何测试你给客户端app开的接口
- WordPress基础:wp_list_pages显示页面信息列表
- centos下软件安装