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 ...
随机推荐
- Python面向对象-反射
python面向对象-反射 在python的面向对象中,与用户交互的主要方式就是利用反射来判断用户输入的指令是否存在和可执行 反射的定义 在python中反射主要是应用于类的对象上,在运行时,将对象的 ...
- SpringBoot的yml文件报org.yaml.snakeyaml.scanner.ScannerException: mapping values are not allowed here in 'reader', line 11, column 16:
报错内容如下: 报错代码如下: 1 spring: 2 cloud: 3 gateway: 4 routes: 5 - id: query_route 6 uri: https://baidu.org ...
- Oracle chr() ascii()
函数简介 实用函数 chr() 和 ascii() chr() 函数将ASCII码转换为字符: ASCII码 –> 字符: ascii() 函数将字符转换为ASCII码: 字符 –> AS ...
- golang的条件编译
写c/c++或者rust的开发者应该对条件编译不陌生,条件编译顾名思义就是在编译时让代码中的一部分生效或者失效,从而控制编译时的代码执行路径,进而影响编译出来的程序的行为. 这有啥用呢?通常在编写跨平 ...
- WgelCTF打靶笔记(2)
参考视频:https://www.bilibili.com/video/BV1itwgeHEEk/?spm_id_from=333.1387.upload.video_card.click&v ...
- tomcat非root用户启动
部署远程服务器时候, 基本都是用root账户登录, 习惯上会直接使用root启动tomcat. 这样其实是有风险的, 黑客获取的权限即容器的权限, 如果容器运行权限就很高,被攻破黑客即可获取很高的权限 ...
- Spring的AoP(面向切面编程)
作用: 就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的 基础上,对我们的已有方法进行增强. 优势: 减少重复代码 提高开发效率 维护方便 AoP的实现方式:动态 ...
- springboot整合log4j
一.默认名log4j2-spring.xml,就省下了在application.yml中配置 <console name="Console" target="SYS ...
- 为什么 Java 中 CMS 垃圾收集器在发生 Concurrent Mode Failure 时的 Full GC 是单线程的?
为什么 Java 中 CMS 垃圾收集器在发生 Concurrent Mode Failure 时的 Full GC 是单线程的? 在 CMS(Concurrent Mark-Sweep)垃圾收集器中 ...
- MySQL之profiling性能优化
如果需要优化一条SQL,想了解一条sql的每个阶段的耗时分布,则可以使用profiling来进行分析,能很方便的定位在哪个阶段.什么资源引起的性能问题. 一.开启profiling参数 此参数默认是关 ...