Java 日看一类(43)之IO包中的PipedOutputStream类

【Java】JAVA知识总结浅析 Java是一门功能强大的编程语言,广泛应用于多个领域。Java的编程思想,包括面向过程和面向对象编程,Java的发展历史,各版本的特点,JVM原理,数据类型,Java SE与Java EE的区别,应用场景,JDK与JDBC,Java Web技术,Spring Boot系列,以及MyBatis框架的基本实现,最后还将讨论Java在大数据、人工智能、嵌入式和Android等领域的应用。 阅读详情

该类继承自OutputStream

引入了IO包(本来就是这个包里的,引得没看懂)



该类的类头注释如下:

/**
 * A piped output stream can be connected to a piped input stream
 * to create a communications pipe. The piped output stream is the
 * sending end of the pipe. Typically, data is written to a
 * <code>PipedOutputStream</code> object by one thread and data is
 * read from the connected <code>PipedInputStream</code> by some
 * other thread. Attempting to use both objects from a single thread
 * is not recommended as it may deadlock the thread.
 * The pipe is said to be <a name=BROKEN> <i>broken</i> </a> if a
 * thread that was reading data bytes from the connected piped input
 * stream is no longer alive.
 *
 * @author  James Gosling
 * @see     java.io.PipedInputStream
 * @since   JDK1.0
 */

大意如下:

管道输出流可以与管道输入流连接成可用的通信管道

管道输出流是管道的发送段

典型情况下,数据会被某线程写入管道输出流,然后会被与其链接的管道输入流通过其他线程读出

建议使用这两个类时不要使用单线程(可能会造成死锁)

如果某个线程正从连接的管道输入流中读取数据字节,但该线程不再处于活动状态,则该管道被视为断裂



该类含有如下的成员变量:

与其相连接的管道输入流

private PipedInputStream sink;



该类含有如下的成员方法:

构造函数(与给定的输入流相链接

public PipedOutputStream(PipedInputStream snk)  throws IOException {
    connect(snk);
}

构造函数(空,不链接

public PipedOutputStream() {
}

与输入流相链接

public synchronized void connect(PipedInputStream snk) throws IOException {
    if (snk == null) {//输入流有效性
        throw new NullPointerException();
    } else if (sink != null || snk.connected) {//自己或给定流已链接
        throw new IOException("Already connected");
    }
    sink = snk;//绑定对象
    snk.in = -1;//缓存空间偏移量修改
    snk.out = 0;
    snk.connected = true;
}

写入一个字节

public void write(int b)  throws IOException {
    if (sink == null) {
        throw new IOException("Pipe not connected");
    }
    sink.receive(b);//输入流接收
}

写入一个字节数组

public void write(byte b[], int off, int len) throws IOException {
    if (sink == null) {//链接检查
        throw new IOException("Pipe not connected");
    } else if (b == null) {//数组有效性检查
        throw new NullPointerException();
    } else if ((off < 0) || (off > b.length) || (len < 0) ||//下标有效性
               ((off + len) > b.length) || ((off + len) < 0)) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return;
    }
    sink.receive(b, off, len);
}

刷新输出流(写出底层流缓冲的数据,并且唤醒沉睡的reader线程

public synchronized void flush() throws IOException {
    if (sink != null) {
        synchronized (sink) {//保证控制权
            sink.notifyAll();//唤起reader线程读取缓冲数据
        }
    }
}

关闭管道(释放资源

public void close()  throws IOException {
    if (sink != null) {
        sink.receivedLast();//关闭了写入端,并且唤醒读取线程读取剩余缓存
    }
}



该类的操作主要都是通过调用PipedInputStream类,相当于把大部分操作都封装到输入流里了,所以在学习这个之前建议先去学习PipedInputSream

WSL 2 部署 Rocky Linux 9:从零到生产环境配置指南(2025版) 本文详细介绍了如何在WSL 2上部署Rocky Linux 9,从环境准备到生产环境配置的全流程指南。通过优化安装流程和系统配置,帮助开发者和运维工程师在Windows环境下高效运行企业级Linux系统,特别适合需要本地开发但部署到RHEL系服务器的项目。 阅读详情

相关推荐

【网络协议】TCP的拥塞控制机制

前言 计算机网络中的带宽、交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。 所谓拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不致过载。要注意用拥塞控制与流量控制的区别,拥塞控制是一个全局性的过程,涉及到所有的额主机、路由器,以及与降低网 拥塞控制的算法有:慢开始、拥塞避免、快重传、快恢复四种。 慢开始和拥塞避免 发送方维持一个拥塞窗口的状态变量,其大小取决于网络的拥塞程度

兰亭风雨的专栏 1万+

管道流(线程流)——PipedInputStream、PipedOutputStream

线程流,顾名思义就是在线程之间传输数据的流。主要用途自然就是用于线程之间通讯。 线程流必须输入输出一起使用只使用一个会抛出 java.io.IOException: Pipe not connected而且也不能一个对应多个 只能一对一,一对多会抛出java.io.IOException: Already connected; 例: import java.io.IOExceptio...

淡淡的心 1305

西电微机系统课程设计——步进电机开环控制系统设计

西电微机系统课程设计——步进电机开环控制系统设计 一、课程设计目的 1.掌握微机系统总线与各芯片管脚连接方法,提高接口扩展硬件电路的连接能力。 2.加深对 A/D 和并行接口芯片的工作方式和编程方法的理解。 3.搞懂步进电机的工作原理及控制方式,掌握开环控制系统的设计思路和实现方法。 二、课程设计的内容 手动调节电位器旋钮(0V~5V),通过 ADC0809 模拟输入水库水位 0 米~50 米,CPU收到水位信号后,根据水位高度控制步进电机(水闸)进行调节。 三、系统功能与设计要求 基本功能要求 手

OutlierLi's Blog 7531

【Java并发编程】管道输入输出流PipedReader/PipedWriter

线程之间通信的三种方式: (1)共享内存。 (2)wait()/notify()方法。 (3)管道输入输出流。 本篇将介绍第三种方式,使用管道输入输出流进行线程间的通信。 管道输入/输出流的思想: Java里的管道输入流PipedWriter与管道输出流PipedReader实现了类似管道的功能,用于不同线程之间的相互通信。 java的管道输入与输出实际上使用的是一个循环缓冲数组...

fxkcsdn的博客 987

SQL Server2008详细安装步骤(超详细步骤)

https://pan.baidu.com/s/1yvolqfU-AbiuGrIzblA7pA 提取码:lzw81.下载好安装包后解压到除C盘以外的磁盘,避免系统卡顿2.使用管理员身份打开安装程序注意:使用管理员身份打开时,此时如果显示以下画面属于正常现象,下载安装即可。因为.net现在有很多软件都需要,包括SQLSERVER2008,它里面有visual studio都要有net,电脑系统没有的话安装一下好了。3.选择全新安装或向现有安装添加新功能4.点击确定5.出现以下画面之后,输入产品密钥即可(密钥在

m0_67402774的博客 4万+

Mac终端SSH连接腾讯云服务器保姆级教程(附秘钥管理技巧)

本文提供Mac终端SSH连接腾讯云服务器的详细教程,涵盖密钥生成、权限设置、连接优化及高级管理技巧。通过清晰的步骤和实用配置,帮助用户安全高效地管理远程服务器连接,特别适合开发者和运维人员参考。

weixin_29248313的博客 458

java socket异常总结

Java Socket 网络编程常见异常 1.java.net.SocketTimeoutException . 这 个异 常比较常见,socket 超时。 一般有 2 个地方会抛出这个,一个是 connect 的 时 候 , 这 个 超 时 参 数 由connect(SocketAddress endpoint,int timeout) 中的后者来决定,还有就是 setSoTimeout(...

welcome66的专栏 895

K-means算法代码实现(python)

K-means算法代码实现以及解决质心选择问题 计算距离 距离通常使用欧几里得距离来衡量 def euclDistance(vector1, vector2): return np.sqrt(sum((vector2 - vector1) ** 2)) 初始化质心 def initCentroids(data, k): numSamples, dim = data.shape ...

江南小帅瓜的博客 1万+

Java里的管道输入流 PipedInputStream与管道输出流 PipedOutputStream

Java里的管道输入流PipedInputStream与管道输出流PipedOutputStream实现了类似管道的功能,用于不同线程之间的相互通信,下面说下自己的一些理解。

zlp1992的专栏 3万+

iPad秒变Mac副屏的隐藏技巧:用BetterDisplay实现无线竖屏+90度锁定

本文详细介绍了如何利用BetterDisplay软件突破苹果原生“随航”(Sidecar)功能的限制,将iPad无线设置为Mac的竖屏副屏,并实现90度方向锁定。通过创建虚拟显示器、配置分辨率与旋转参数,并校准鼠标指针,用户可以高效利用iPad的纵向空间进行文档阅读、编码等工作,显著提升多屏协作效率。

weixin_29266647的博客 605

OpenClaw 在 Docker 容器中的部署实战——零配置启动

本文介绍了OpenClaw在Docker容器中的快速部署方法,对比了本地部署与容器化部署的优势。通过官方镜像和Docker Compose两种方式,5分钟即可完成部署,并详细讲解了配置管理方案(挂载配置文件和环境变量)。文章还提供了飞书集成配置方法,以及生产环境下的日志管理、资源限制、健康检查等优化建议。最后包含常见问题排查指南,帮助开发者快速实现OpenClaw的容器化部署。

刘一说的IT专栏 912

生产环境异常记录—— java.io.IOException: Broken pipe 的深入分析

java.io.IOException: Broken pipe 异常 Socket 网络套接字 Pipe 网络通信管道

weixin_48566352的博客 6840

激光雷达点云可视化:Open3D与PCL实战

激光雷达点云可视化:Open3D与PCL实战 ,人工智能,计算机视觉,大模型,AI,该文围绕激光雷达点云可视化,介绍了Open3D与PCL的实战应用。先阐述点云基础概念、特点及可视化意义,接着讲解Open3D的简介、环境配置,以及其在点云读取、显示、颜色设置、下采样和滤波等方面的实战操作,还介绍了PCL的基础、环境配置及相关实战,包括点云读取、显示、颜色设置、下采样和滤波,同时对比了两者的易用性、功能覆盖、性能和适用场景,给出综合实战案例与常见问题解决方法,为点云可视化处理提供了全面指导。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 12万+

java 管道设计_java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例...

本章,我们对java 管道进行学习。java 管道介绍在java中,PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流。它们的作用是让多线程可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用。使用管道通信时,大致的流程是:我们在线程A中向PipedOutputStream中...

weixin_29824417的博客 287

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

管道流_PipedInputStream与PipedOutputStream

输入和输出可以直接进行连接,通过结合线程使用(一个线程用于写,另一个用于读,因为管道输入流(读)是要读取管道输出流的数据的,又因为输入流中的read方法是阻塞式的,当两个流在同一个线程中时,输入流的read方法没有数据可以读,就发生阻塞,那么这个线程就挂了) 1 import java.io.IOException; 2 import java.io.PipedInputSt...

165

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

io流--管道流(PipedOutputStream和PipedInputStream)(1)

java管道简洁: 在java中,PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流。 它们的作用是让多线程可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用。 使用管道通信时,大致的流程是:我们在线程A中向PipedOutputStream中写入数据,这些数据会自动的发...

sdsjx01的博客 363

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java io系列04之 管道(PipedOutputStream和PipedInputStream)的简介,源码分析和示例

介绍了PipedOutputStream和PipedInputStream是需要配套使用。其自己的缓冲区大小了 1024,需要自己进行循环跳出。

guyuelin123的博客 794

Java IO学习6:管道流

管道流(线程通信流) 管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream)、管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把输出流连在输入流之上,在PipedOutputStream类上有如下的一个方法用于连接管道: public void connect(PipedInputStream snk)throw...

aodaidi6752的博客 114

管道流源码解析(PipedOutputStream和PipedInputStream)

管道流源码解析(PipedOutputStream和PipedInputStream) PipedOutputStreamJDK6API:可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。不建议对这两个对象尝试使用单个线程,因为这样可能会造...

GritJ的博客 394

我的IO笔记2

为什么80%的码农都做不了架构师?>>> ...

weixin_34191734的博客 127

java-IO

框架图 IO(Input Output)流IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式,用于操作流的对象都在IO包中。流按操作数据分为两种:字节流与字符流 。流按流向分为:输入流,输出流。 字节流的抽象基类:•InputStream ,OutputStream。字符流的抽象基类:•Reader ,Writer。注:由这四个类派生出来的子类名称都是以其父类名作为...

weixin_30685029的博客 106

java之IO 总结和笔记

创建一个文件 Java代码 1. File f=new File("1.txt"); 2. f.createNewFile();//创建文件 3. f.mkdir();//创建目录 4. f.deleteOnExit();//程序结束时自动删除创建的文件 5. File.separator 是跨系统文件分隔符 //list方法...

自强不息 140

JAVA中管道流(线程间通讯)例子

JAVA中管道通讯(线程间通讯)例子   下面例子中使用Java中的PipedInputStream类和PipedOutputStream类,给大家演示如何在Java中实现线程间的数据传送。    1 package lesson.io.test; 2 3 import java.io.*; 4 5 public class TestP...

a616735104的博客 149

Java IO学习笔记(六):管道流

管道流(线程通信流) 管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream)、管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把输出流连在输入流之上,在PipedOutputStream类上有如下的一个方法用于连接管道: public void connect(PipedInputStream snk)throws IOE...

weixin_30312557的博客 139
上一篇: Java 日看一类(42)之IO包中的PipedInputStream
下一篇: Java 日看一类(44)之IO包中的PipedReader类
wyf95278
博客等级 码龄10年 38粉丝 71原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值