java InputStream#read的 end of stream的问题

编程入门 行业动态 更新时间:2024-10-11 17:18:56

java <a href=https://www.elefans.com/category/jswz/34/1684009.html style=InputStream#read的 end of stream的问题"/>

java InputStream#read的 end of stream的问题

网络流的结尾(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();// shutDownInputStreamprivate boolean shutIn = false;// shutDownOutputStreamprivate 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 

更多推荐

java InputStream#read的 end of stream的问题

本文发布于:2024-03-14 16:59:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1736929.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:InputStream   java   stream   read

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!