刨根问底文件结尾

本文探讨了管道过滤器模型在多线程环境下的工作原理。重点分析了PipedReader与PipedWriter如何通过closedByWriter标志来指示文件流末尾,确保所有线程能正确判断何时停止读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        今天做管道过滤器的试验,多个过滤器是多线程并行执行的,每个线程执行结束的条件是从前一个管道的read()方法返回-1,管道就是PipedReader,其read()返回-1的条件是读到文件流末尾。

        下面我就刨根问底,看看究竟什么是文件流末尾。首先打开java开发包中的源代码,找到PipedReader类,找到其中的read()方法,其中有这么一段代码

             if (closedByWriter) {
  /* closed by writer, return EOF */
              return -1;
     }

        接着再找closedByWriter,类定义的开始boolean closedByWriter = false;

        
    synchronized void receivedLast() {
 closedByWriter = true;
 notifyAll();
    }

        哈哈,看来秘密在这里。但哪里调用的receivedLast()?原来是在PipedWriter中调用的,

public void close()  throws IOException {
        closed = true;
 if (sink != null) {
     sink.receivedLast();
 }
    }
至此,真相大白,要在向管道中写完最后一个字节之后,调用PipedWriter中的close函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值