使用while循环从不可靠的IO流例如Internet中读取时会发生什么情况?

问题描述

有人告诉我,从任何IO来源(例如该程序可能是从某种类型的输入流对象读取的,该文件可能是硬盘驱动器上的文件,也可能是Internet URL上的文件,每次允许它拉出N个字节(或一行文本),直到没有字节为止。

当我寻找一些源代码时,我通常会找到类似的东西:

fh = open('my_text_file.txt')
while True:
    line = fh.readline()
    print(line)
    if not line:
        break
fh.close()

while ((line = br.readLine()) != null) {
    System.out.println(line);
}

这些代码通常使用while循环来读取n字节或一行,直到流对象没有返回任何内容为止。我可以理解,当从本地IO源(例如硬盘驱动器)读取文件时,文件流通常是非常可靠的,因此在文件完成之前,流中总是有下一个字节可用。

我的问题是,如果输入流是不可靠的来源怎么办?例如互联网。在这种情况下,while循环将一直从流中读取字节或行,直到没有返回任何内容为止。但是,如何知道它实际上是文件的结尾,而不是仅仅因为文件什么都不读取而导致网络拥塞呢?甚至当今的大多数网络都使用可靠的协议,例如TCP,它将确保文件完好无损。但是,即使使用TCP,也不能保证文件的各个部分会及时到达,以使read()函数读取某些内容以防止while循环在文件结束之前中断吗?我只是很好奇这些输入流对象实际上是如何在非常低的层次上工作的。

解决方法

不是,它们是高级抽象。

如果通过蒸汽读取套接字时套接字断开连接或驱动器崩溃,则通过返回特定值或引发异常,读取将失败。