java InputStream#read的 end of stream的问题

本文探讨了Java中InputStream的end of stream概念,指出在网络流中,read方法通常会阻塞直到接收到远程端的数据。通过TCP/IP协议,socket连接的关闭会通过特定标志位通知对方。代码测试展示了如何触发end of stream,包括关闭输出流和异常情况。总结了关闭和中断连接对读取操作的影响。
摘要由CSDN通过智能技术生成

网络流的结尾(end of stream)是什么?

java.io包中大多数read方法的 javadoc 中,可以读到

the total number of bytes read into the buffer,

 or -1 if there is no more data because the end of the stream has been reached

大致意思是:读取到缓冲区的字节总数,或 -1,如果没有更多的数据,因为已经达到流的结尾

我们都知道 读取文件时,只要读取到 文件的 EOF 标志位,就代表文件读取完成了,inputStream 就会返回 -1,代表可以结束读取了,因此,这 个 EOF 不需要我们主动去判断。

但是,我从未真正获得 -1,因为大多数流(在网络的情况下) 流(我最常使用的流)只是阻塞程序执行,直到在远程端将某些内容写入流中,才会继续执行。

因为 socket 是基于 TCP/IP 规则,编写的程序,那么,就涉及到 TCP/IP 数据包的结构了,所以,我想,socket之间也是通过 改变数据包中某个标志位通知对方的,让对方改变 socket中的 shutOut=true

public
class Socket implements java.io.Closeable {
   
    /**
     * Various states of this socket.
     */
    private boolean created = false;
    private boolean bound = false;
    private boolean connected = false;
    private boolean closed = false;
    private Object closeLock = new Object();
    // shutDownInputStream
    private boolean shutIn = false;
    // shutDownOutputStream
    private boolean shutOut = false;
}

经过代码调试,我发现 read 是一个阻塞函数,如果A端没有主动断开OutputStream(输出流),那么,B端就会认为A端仍旧可能发送数据。

像 read这种阻塞读取函数还有: BufferedReader#readLineDataInputStream#readUTF等。

代码测试

客户端

public class SocketClient {
   
    public static void main(String[] args) throws IOException {
   
        Socket client;
        OutputStream out = null;
        InputStream input = null;
        try 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值