Java IO<5>管道流PipedOutputStream PipedInputStream
在java中,PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流。它们的作用是让多线程可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用。
使用管道通信时,大致的流程是:我们在线程A中向PipedOutputStream中写入数据,这些数据会自动的发送到与PipedOutputStream对应的PipedInputStream中,进而存储在PipedInputStream的缓冲中;此时,线程B通过读取PipedInputStream中的数据。就可以实现,线程A和线程B的通信。
可以使用两个管道共有的connect()方法使之相关联。PipedInputStream和PipedOutputStream都拥有一个可以互相关联的connect()方法。
管道输入流PipedInputStream与管道输出流PipedOutputStream建立连接
一般我们使用都是先定义一个管道输入流PipedInputStream对象和管道输出流PipedOutputStream对象,然后将他们关联起来,建立了一条”管道”。
使用connect()方法建立连接:
PipedInputStream pipedInputStream=new PipedInputStream();
PipedOutputStream pipedOutputStream=new PipedOutputStream();
try {
pipedInputStream.connect(pipedOutputStream);
} catch (IOException e) {
e.printStackTrace();
}
不使用connect()方法:
PipedInputStream pipedInputStream=new PipedInputStream();
PipedOutputStream pipedOutputStream=null;
try {
pipedOutputStream = new PipedOutputStream(pipedInputStream);
} catch (IOException e) {
e.printStackTrace();
}
使用示例:
import java.util.Random;
public class Test {
//管道输出流
private static PipedOutputStream outputStream = new PipedOutputStream();
//管道输入流
private static PipedInputStream inputStream = new PipedInputStream();
private static byte[] buf = new byte[1024];
// int nextInt(int n)
//该方法的作用是生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n。
private static Random random = new Random();
public static void main(String[] args) throws Exception {
DataInputStream dataInputStream = new DataInputStream(inputStream);
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
String str = "asdfghjklqwertyuiopzxcvbnm";
//输出线程
Runnable producer = () -> {
try {
while (true) {
Thread.sleep(1000);
int len = random.nextInt(20) + 1;
dataOutputStream.writeInt(len);
String randomString = getRandomString(len);
System.out.println("发送" + randomString);
dataOutputStream.write(randomString.getBytes());
dataOutputStream.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
};
//输入线程
Runnable consumer = () -> {
try {
while (true) {
int len = dataInputStream.readInt();
dataInputStream.readFully(buf, 0, len);
System.out.println("收到" + new String(buf, 0, len));
}
} catch (Exception e) {
e.printStackTrace();
}
};
//连接管道
inputStream.connect(outputStream);
//启动线程
new Thread(producer).start();
new Thread(consumer).start();
}
//生成随机字符串
public static String getRandomString(int length) {
String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(62);
sb.append(str.charAt(number));
}
return sb.toString();
}
}
注:本例忽略了流的关闭。请在处理流的过程中,务必保证关闭流,或者使用jdk7引入的try-resources代替显示地调用close方法的方式。
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class PipeStream {
//管道输出流
private static PipedOutputStream outputStream = new PipedOutputStream();
//管道输入流
private static PipedInputStream inputStream = new PipedInputStream();
public static void main(String[] args) throws Exception {
//输出线程
Runnable out = ()-> {
try {
while(true) {
Thread.sleep(1000);
outputStream.write("pipe".getBytes());
}
} catch (Exception e) {
e.printStackTrace();
}
};
//输入线程
Runnable in = ()-> {
try {
byte[] bytes = new byte [1024];
int len;
while ((len = inputStream.read(bytes)) != -1) {
System.out.println(new String(bytes,0,len));
}
} catch (Exception e) {
e.printStackTrace();
}
};
//连接管道
inputStream.connect(outputStream);
//启动线程
new Thread(out).start();
new Thread(in).start();
}
}
Java IO<5>管道流PipedOutputStream PipedInputStream的更多相关文章
- 系统学习 Java IO (六)----管道流 PipedInputStream/PipedOutputStream
目录:系统学习 Java IO---- 目录,概览 PipedInputStream 类使得可以作为字节流读取管道的内容. 管道是同一 JVM 内的线程之间的通信通道. 使用两个已连接的管道流时,要为 ...
- JAVA IO之管道流总结大全(转)
要在文本框中显示控制台输出,我们必须用某种方法“截取”控制台流.换句话说,我们要有一种高效地读取写入到System.out和 System.err 所有内容的方法.如果你熟悉Java的管道流Piped ...
- java IO 管道流PipedOutputStream/PipedInputStream
详情:管道流的具体实现 import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputS ...
- Java中的管道流 PipedOutputStream和PipedInputStream
我们在学习IO流的时候可能会学字节流.字符流等,但是关于管道流的相信大部分视频或者教程都是一语带过,第一个是因为这个东西在实际开发中用的也不是很多,但是学习无止境,存在既有理.JDK中既然有个类那说明 ...
- java io之管道流
一.java.io中存在一中流叫管道流,类似管道的功能.PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流.这个两个流必须同时使用. 二.作用:进行两个线 ...
- Java使用PipedStream管道流通信
多线程使用PipedStream 通讯 Java 提供了四个相关的管道流,我们可以使用其在多线程进行数据传递,其分别是 类名 作用 备注 PipedInputStream 字节管道输入流 字节流 Pi ...
- java多线程通过管道流实现不同线程之间的通信
java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...
- Java IO 文件与流基础
Java IO 文件与流基础 @author ixenos 摘要:创建文件.文件过滤.流分类.流结构.常见流.文件流.字节数组流(缓冲区) 如何创建一个文件 #当我们调用File类的构造器时,仅仅是在 ...
- Java IO之处理流
一.处理流: 增强功能,提供性能,在节点流之上. 二.节点流与处理流的关系 节点流(字节流.字符流)处于IO操作的第一线,所有操作必须通过它们进行: 处理流可以对其他流进行处理(提高效率或操作灵活性) ...
- Java IO: 其他字符流(下)
作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackReader,LineNumberReader,St ...
随机推荐
- Linux 安装配置Anaconda
下载地址 https://www.anaconda.com/download/success 选择系统版本,复制链接 wget https://repo.anaconda.com/archive/An ...
- go 判断数组下标是否存在
举例 现在需要判断命令行是否传了参数,即 os.Args[1] 是否存在 如果使用下述的判断: func main() { fmt.Println(os.Args[1]) } 会报错:index ou ...
- ORACLE数据挖掘之 MSET-SPRT
虽然是熟悉的Oracle数据库,但关于机器学习.数据挖掘这方面的知识笔者起初也是不了解的,文中MSET相关设置来源于同事提供的sample,在测试过程中边查资料边学习吸收,也因此看到了别样的Oracl ...
- OpenGL ES与GLSL ES各版本对应说明
OpenGL ES 3.2 OpenGL ES 3.2 and OpenGL ES Shading Language 3.20 OpenGL ES 3.1 OpenGL ES 3.1 and Open ...
- SCRAPY入门学习(待完善)
Scrapy介绍 Scrapy 是用 Python 实现的一个为了爬取网站数据.提取结构性数据而编写的应用框架. Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 通常我们 ...
- 安装Realtek RTL8111/RTL8168网卡驱动详解(error~eth0:no such device)
昨天给linux系统重新编了个内核linux2.6.31.9,进入新版本的内核之后,发现机子上不了网了.好像每次新编译一个内核版本,网卡都会出问题,之前也写过解决网卡问题的blog,不过比较简单,这里 ...
- Ubuntu更换cuda版本,gcc,g++版本
Ubuntu更换cuda版本,gcc,g++版本 更换cuda版本 这个比较简单 可以看到 /usr/local下面有一个软链接,更换到我们需要的版本即可,cuda对应版本安装可参考官网. 创建软连接 ...
- 【Python】import模块和包
模块和包 一. 模块 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 模块能定义函数,类和变量,模块里也能包含可执 ...
- SearXNG+MCP实现搜索引擎,想怎么搜就怎么搜
一.概述 MCP应用市场,有很多搜索引擎的应用.但是你们会发现,普遍都需要api-key.你必须花钱购买api-key才能实现搜索功能. 问题来了,我就想用免费搜索的,就向百度一样,可不可以? 答案是 ...
- 大模型向量数据库去重的N种实现方案!
简单来说,"向量"Vector 是大模型(LLM)在搜索时使用的一种"技术手段",通过向量比对,大模型能找出问题的相关答案,并且进行智能回答. 向量简介 Vec ...