Java 日看一类(44)之IO包中的PipedReader类

一文彻底掌握Java IO类库 Java开发过程中经常会用到 Java IO 类库,本文将深入源码,带你彻底掌握 Java IO 类库。 Java IO类图框架 Java IO 类库可以大体划分为字节流和字符流两大类,再根据输入和输出两种情况,可以再分为四小类。所以大致框架图如下所示: 如上图,Java 类图并不繁多,而且分类和命名都非常清晰。其中需要重点掌握的类已经加粗展示在图里。 下边我们逐类逐个展开分析整个类库。 字节流 顾名思义,字节流相关类是处理字节类型数据的,而且都是以『Stream』为后缀的类。根据输入输.. 阅读详情

该类无引入包

继承自Reader类


该类的类头注释如下:(我见过最简洁的

 Piped character-input streams.

大意如下:

管道字符输入流



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

对应得输出流标志位(是否关闭

boolean closedByWriter = false;

对应读取流关闭标志位(就是自己,感觉这里也该加上volaile

boolean closedByReader = false;

连接状态

boolean connected = false;

读取线程

Thread readSide;

写入线程

Thread writeSide;

默认缓冲区大小

private static final int DEFAULT_PIPE_SIZE = 1024;

缓冲区

char buffer[];

写入偏移量

int in = -1;

读取偏移量

int out = 0;


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

构造函数(与给定的写出管道链接,使用默认大小缓冲区

public PipedReader(PipedWriter src) throws IOException {
    this(src, DEFAULT_PIPE_SIZE);
}

构造函数(与给定的写出管道连接,使用指定大小缓冲区

public PipedReader(PipedWriter src, int pipeSize) throws IOException {
    initPipe(pipeSize);
    connect(src);
}

默认构造函数(暂无链接,默认大小

public PipedReader() {
    initPipe(DEFAULT_PIPE_SIZE);
}

构造函数(暂无链接,给定大小

public PipedReader(int pipeSize) {
    initPipe(pipeSize);
}

管道初始化(初始化缓冲区

private void initPipe(int pipeSize) {
    if (pipeSize <= 0) {
        throw new IllegalArgumentException("Pipe size <= 0");
    }
    buffer = new char[pipeSize];
}

连接管道

public void connect(PipedWriter src) throws IOException {
    src.connect(this);
}

接收单个字符数据进管道

synchronized void receive(int c) throws IOException {
    if (!connected) {//检查连接状态
        throw new IOException("Pipe not connected");
    } else if (closedByWriter || closedByReader) {//检测是否有一段关闭
        throw new IOException("Pipe closed");
    } else if (readSide != null && !readSide.isAlive()) {//检测读取线程活动性
        throw new IOException("Read end dead");
    }

    writeSide = Thread.currentThread();
    while (in == out) {//当前缓冲区已满,暂时无法写入
        if ((readSide != null) && !readSide.isAlive()) {
            throw new IOException("Pipe broken");
        }
        /* full: kick any waiting readers */
        notifyAll();//唤醒所有挂起线程(读取线程
        try {
            wait(1000);//挂写入线程
        } catch (InterruptedException ex) {
            throw new java.io.InterruptedIOException();
        }
    }
    if (in < 0) {//缓冲为空
        in = 0;
        out = 0;
    }
    buffer[in++] = (char) c;//存写入数据
    if (in >= buffer.length) {//循环数组修改偏移量
        in = 0;
    }
}

接收字符数组(对上一个函数的循环调用

synchronized void receive(char c[], int off, int len)  throws IOException {
    while (--len >= 0) {
        receive(c[off++]);
    }
}

当写入端数据全部传输完后,唤醒读取线程,关闭管道

synchronized void receivedLast() {
    closedByWriter = true;
    notifyAll();//唤醒所有读取线程
}

读取字符数据

public synchronized int read()  throws IOException {
    if (!connected) {//管道连接状态
        throw new IOException("Pipe not connected");
    } else if (closedByReader) {//Reader端是否关闭
        throw new IOException("Pipe closed");
    } else if (writeSide != null && !writeSide.isAlive()//检测现在是否有程序在写入
               && !closedByWriter && (in < 0)) {
        throw new IOException("Write end dead");
    }

    readSide = Thread.currentThread();//写入线程绑定
    int trials = 2;//两次机会
    while (in < 0) {//当前为空
        if (closedByWriter) {//且写入端已关闭
            /* closed by writer, return EOF */
            return -1;
        }
        if ((writeSide != null) && (!writeSide.isAlive()) && (--trials < 0)) {
            throw new IOException("Pipe broken");
        }
        /* might be a writer waiting */
        notifyAll();//唤醒所有线程(写线程
        try {
            wait(1000);//睡读取线程
        } catch (InterruptedException ex) {
            throw new java.io.InterruptedIOException();
        }
    }
    int ret = buffer[out++];//读取数据
    if (out >= buffer.length) {
        out = 0;
    }
    if (in == out) {//读取完毕,缓冲区为空
        /* now empty */
        in = -1;
    }
    return ret;//返回字符的UTF-8
}

读取出字符数组

public synchronized int read(char cbuf[], int off, int len)  throws IOException {
    if (!connected) {
        throw new IOException("Pipe not connected");
    } else if (closedByReader) {
        throw new IOException("Pipe closed");
    } else if (writeSide != null && !writeSide.isAlive()
               && !closedByWriter && (in < 0)) {
        throw new IOException("Write end dead");
    }

    if ((off < 0) || (off > cbuf.length) || (len < 0) ||//下表有效性检查
        ((off + len) > cbuf.length) || ((off + len) < 0)) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return 0;
    }

    /* possibly wait on the first character */
    int c = read();//调用上个函数获得数据
    if (c < 0) {//判定缓冲区是否为空
        return -1;
    }
    cbuf[off] =  (char)c;//写入数组
    int rlen = 1;//实际读取出的长度
    while ((in >= 0) && (--len > 0)) {//循环读取
        cbuf[off + rlen] = buffer[out++];
        rlen++;
        if (out >= buffer.length) {
            out = 0;
        }
        if (in == out) {
            /* now empty */
            in = -1;
        }
    }
    return rlen;
}

检查当前管道是否可以进行数据读取

public synchronized boolean ready() throws IOException {
    if (!connected) {
        throw new IOException("Pipe not connected");
    } else if (closedByReader) {
        throw new IOException("Pipe closed");
    } else if (writeSide != null && !writeSide.isAlive()
               && !closedByWriter && (in < 0)) {
        throw new IOException("Write end dead");
    }
    if (in < 0) {
        return false;
    } else {//管道有效且缓冲区不为空
        return true;
    }
}

关闭当前管道

public void close()  throws IOException {
    in = -1;//清空缓冲区
    closedByReader = true;//reader端关闭
}


该类与PipedInputStream类基本一样,只是在操作的时候加入char类型的强制转码,该类一些需要注意的地方与PipedInputStream相同,如有需要请查阅。

SGO基线解算软件(南方测绘UI设计最美观的一款新版) 不多说,先放地址: 下载地址:https://www.southgnss.com/download_view.asp?did=361 SGO是南方测绘集团广州南方卫星导航仪器有限公司自主研发新一代南方地理数据处理平台软件,对南方特有数据格式文件(STH格式文件)、标准数据格式文件(RINEX格式文件)进行静态数据处理、动态数据后处理和进行RTK结果检验,新增加了北斗数据处理和摄影测量模块,并围绕南方的不同类型测量产品集成多款测绘领域所需的小工具,实现测绘内业数据处理一体化。 相关概念 G.. 阅读详情

相关推荐

Win10 环境下 ISE14.7 iMPACT 闪退的 DLL 修复方案 - FPGA 开发实战

本文详细介绍了在Win10系统下解决ISE14.7 iMPACT工具闪退问题的DLL修复方案,特别针对FPGA开发中常见的兼容性问题。通过替换关键DLL文件,有效解决了iMPACT在生成PROM文件时的崩溃问题,并提供了详细的步骤说明和注意事项,帮助开发者提升工作效率。

weixin_29197051的博客 210

java pipe closed_java io系列20之 PipedReader和PipedWriter

本章,我们学习PipedReader和PipedWriter。它们和“PipedWriter 是字符管道输出流,它继承于Writer。PipedReader 是字符管道输入流,它继承于Writer。PipedWriter和PipedReader的作用是可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedWriter和PipedReader配套使用。PipedWriter和PipedRe...

weixin_34752204的博客 947

YOLOv5模型转换陷阱:从PT到RKNN的置信度异常与乱框问题深度解析

本文深度解析了YOLOv5模型从PT到RKNN转换过程中的置信度异常与检测框错乱问题,揭示了NPU硬件特性与模型结构不匹配的根本原因。通过详细的解决方案和实操步骤,包括模型修改、转换流程配置和验证技巧,帮助开发者有效解决这一常见部署难题,提升模型在瑞芯微芯片上的推理性能。

weixin_29062255的博客 907

Java IO:PipedReader和PipedWriter使用详解及源码分析

使用方法  PipedReader和PipedWriter即管道输入流和输出流,可用于线程间管道通信。它们和PipedInputStream/PipedOutputStream区别是前者操作的是字符后者是字节。方法介绍  PipedReader提供的API如下://构造方法 PipedReader(PipedWriter src) //使用默认的buf的大小和传入的pw构造pr PipedRe

ahsxsk的学习之路 5580

别再硬啃C代码了!用Simulink的Matlab Function模块手把手教你搭建CRC8校验模型(附完整M脚本)

本文详细介绍了如何利用Simulink的Matlab Function模块轻松实现CRC8校验模型,替代传统的C代码编写。通过可视化建模和即时验证,开发者可以高效完成算法设计,并自动生成嵌入式代码。文章包含完整的M脚本示例和工程实践技巧,特别适合嵌入式系统开发人员提升工作效率。

weixin_42520661的博客 186

Unity Acceleratorc与Cache Server unity的缓存服务器

文章目录1.作用概述2.用法(使用,看这个就够了)服务端下载部署Unity Acceleratorc修改http管理端口修改Editor连接端口客户端使用(设置好一次提交设置,团队拉取即可全部生效)3.测试平台切换测试资源导入测试(打开编辑器的情况下)项目启动测试(不打开编辑器的情况下)4.不同版本表现5.服务端监控6.服务端缓存7.冲突8.预警9.不同项目/不同配置-同种资源10.缓存清除 1.作用概述 编辑器模式下,导入资源,切换平台unity都会重新识别资源,大型项目很浪费时间,使用Cache Ser

euphorias的博客 3812

[重学Java基础][Java IO流][Part.5]管道字符输入输出流

[重学Java基础][JavaIO流][Part.5]管道字符输入输出流 [重学Java基础][JavaIO流][Part.5]管道字符输入输出流 PipedReader 概述 源码分析 成员变量 成员方法 PipedWriter 概述 源码分析 成员变量 成员方法 PipedReader PipedWriter综合代码示例 PipedReader 概述 Pip...

一个自我学习的记录之处 249

Workbuddy+DeepSeek V4傻瓜流配置全指南:API接入、模型切换与Agent实战

AI编程助手的核心价值不在于模型本身,而在于如何稳定、安全、低门槛地调用其能力。Agent作为智能体范式,依赖可靠的运行时环境与标准化API通信;DeepSeek V4系列凭借高吞吐、低延迟和强工具调用支持,成为当前生产级Agent的理想引擎。Workbuddy则通过本地配置管理、环境变量注入与UTF-8无BOM容错等工程设计,将复杂部署简化为可复现、可版本化、可团队协同的实践流程。本文聚焦API接入路径下的真实卡点——从Key获取验证、models.json字段语义到沙箱权限控制,覆盖开发者在Window

weixin_33702545的博客 2394

java io PipedInputStream源码分析

目录 简介 字段closedByWriter,closedByReader,connected,readSide,writeSide,buffer,in,out 4个构造函数,方法initPipe,connected 2个receive方法,checkStateForReceive方法,awaitSpace方法,receivedLast方法 2个read方法,available方法,close方法 简介 package java.io; /** * 管道输入流应该连接到管道输出流;

今天吃了吗的博客 484

STM32H743 LAN8720网口配置避坑指南:用CubeMX v6.5.0快速搞定LWIP+FreeRTOS

本文详细介绍了使用CubeMX v6.5.0配置STM32H743与LAN8720网口的LWIP+FreeRTOS方案,涵盖硬件连接、时钟配置、ETH外设初始化及LWIP协议栈调优等关键步骤。特别针对常见陷阱提供解决方案,帮助开发者快速实现稳定网络通信,适用于嵌入式网络开发场景。

weixin_33739523的博客 359

Android Camera MTK框架

Camera简介: 虽然前文说道Android在5.0之后就推出了Camera2 API,但是各个厂家的基本未适配,导致目前市场上大部分机型使用的仍然是Camera1 API。PS:Android 9.0 Google强制要求各个平台厂商(高通/MTK/华为等)支持Camera2,不再兼容Camera1。 ...

weixin_49303682的博客 5512

java管道流的使用疑问Write end dead?

在做一个web日志浏览小工具时候 使用到了java的管道流. 但是使用过程中却一直报了 Write end dead 的异常. 我的需求是这样的: 创建好的管道流, 输出流放入 日志的appender 里面,这样log4j 记录日志时候会自动写入, 然后我再人为跑一个线程不断去读取管道的输入流, 每当有websocket连接进来时候就将其session放入一个集合, 自定义的线程遍历s...

PiaoMiaoXiaodao的博客 2129

RK3568 Android14 移远GNSS卫星导航模组LC760Z GPS北斗定位模块调试

Rockchip RK3568 作为一款高性能、低功耗的国产SoC,被广泛应用于工业网关、车载中控和智能手持终端等领域。在这些应用场景中,位置服务(Location Service) 往往是不可或缺的功能。本文将详细记录如何集成GPS模组到 RK3568 开发板上,通过 UART(串口)接口集成通用的 GPS 模块(如 移远LC760Z 或 EC20 4G 模块自带的 GPS 功能也差不多),并实现数据的解析与上层应用对接。

qq_33427070的博客 1414

java io系列20之 PipedReader和PipedWriter

本章,我们学习PipedReader和PipedWriter。它们和“PipedInputStream和PipedOutputStream”一样,都可以用于管道通信。 PipedWriter 是字符管道输出流,它继承于Writer。 PipedReader 是字符管道输入流,它继承于Writer。 PipedWriter和PipedReader的作用是可以通过管道进行线程间的通讯。在使用

XINJing的专栏 403

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java 使用pipe进行线程间通讯

Thinking in Java 中的例子,两个线程Sender&Receiver使用pipe进行通讯。Pipe是一个阻塞队列,解决了“生产者-消费者”线程通讯的问题。 1 import java.io.IOException; 2 import java.io.PipedReader; 3 import java.io.PipedWriter; 4 impo...

arkrszji40041的博客 211

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

线程间的通信方式2--管道流Pipes

“管道”是java.io包的一部分。它是Java的特性,而不是Android特有的。一条“管道”为两个线程建立一个单向的通道。生产者负责写数据,消费者负责读取数据。 下面是一个使用管道流进行通信的例子。 1 public class PipeExampleActivity extends Activity { 2 3 private static final String TA...

weixin_33877092的博客 102

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java reader_Java Reader close()方法与示例

java reader Reader类的close()方法 (Reader Class close() method) close() method is available in java.io package. close()方法在java.io包中可用。 close() method is used to close this Reader stream and free all syste...

cumtv80668的专栏 1375

使用ExecuteReader时报错“阅读器关闭时尝试调用Read无效”的解决办法

出现如下绿色字体出错的问题,是由于using使用过后数据库会自动关闭,出了using的作用域后,在调用的时候无法找到信息form1.cs        public static SqlDataReader ExecuteReader(string sql, params SqlParameter[] parameters)         {             string connStr...

child_my的博客 2449

Java8 I/O源码-PipedReader与PipedWriter

PipedReader与PipedWriter分别为字符管道输入流和字符管道输出流。管道输入流通过连接到管道输出流实现了类似管道的功能,用于线程之间的通信。 通常,由某个线程向管道输出流中写入数据。根据管道的特性,这些数据会自动发送到与管道输出流对应的管道输入流中。这时其他线程就可以从管道输入流中读取数据,这样就实现了线程之间的通信。

潘威威的博客 889

SftpUtil Pipe closed 超时导致的

我的报错情况是连接成功,然后超过90s不操作,自动断开连接,此时没判断连接是否正常,直接读取文件,导致报错。 我导致这个错误的步骤是://创建sftp对象Channel channel = sshSession.openChannel("sftp");channel.connect();ChannelSftp sftp = (ChannelSftp) channel; //等待时间超过超时

Zealot_Cat的博客 1万+

Java 日看一类(30)之IO包中的InterruptedIOException、InvalidObjectException异常类

这次讲述的类可能有一点多,不过每个类的内容都比较少(异常类没多少内容代码)InterruptedException类无引入包继承自IOException类头注释如下/** * Signals that an I/O operation has been interrupted. An * &lt;code&gt;InterruptedIOException&lt;/code&gt; is th...

github_37666068的博客 5939

Java 日看一类(37)之IO包中的ObjectStreamField类

该类完成了Comparable&lt;Object&gt;接口引入了import java.lang.reflect.Field; import sun.reflect.CallerSensitive; import sun.reflect.Reflection; import sun.reflect.misc.ReflectUtil;该类的类头注释如下:/** * A description ...

github_37666068的博客 3465

Java 日看一类(62)之net包中的Authenticator类

该类无引入包和继承类该类的类头注释如下:/** * The class Authenticator represents an object that knows how to obtain * authentication for a network connection. Usually, it will do this * by prompting the user for info...

github_37666068的博客 2872

Java 日看一类(58)之IO包中的SyncFailedException、UncheckIOException和UnSupportedEncodingException异常类

SyncFailedException无引入包继承自IOException该类的类头注释如下:Signals that a sync operation has failed.大意如下:标志同步操作失败该类含有如下的成员变量:序列化IDprivate static final long serialVersionUID = -2353342684412443330L;该类含有如下的成员方法:构造函...

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值