6

关于stackoverflow 问题,据说可以使用 或 通过使用InputStream多次读取mark()reset()提供。InputStreamPushbackInputStream

在所有这些情况下,流的内容都存储在字节数组中(即文件的原始内容存储在主内存中)并多次重复使用。

当文件大小超过内存大小时会发生什么?我认为这可能会为OutOfMemoryException.

有没有更好的方法来多次读取流内容而不将流内容存储在本地(即,在主存储器中)?

请帮助我知道这一点。提前致谢。

4

1 回答 1

16

这取决于流的来源。

如果它是本地文件,您可以根据需要多次重新打开和重新读取流。

如果它是由进程、远程服务等动态生成的,您可能无法自由地重新生成它。在这种情况下,您需要将其存储在内存中或一些更持久(且速度较慢)的存储中,例如文件系统或存储服务。


也许一个类比会有所帮助。假设您的朋友正在与您进行长时间的交谈。你仔细听,没有打断,但是当他们说完后,你意识到你没有理解他们在开始时所说的内容,并想复习那部分。

在这一点上,有几种可能性。

也许你的朋友实际上是在大声朗读一本书。你可以简单地重新阅读这本书。

或者,也许你必须有远见才能记录他们的独白。您可以重播录音。

但是,由于您和您的朋友都没有完美且无限的回忆,因此仅凭记忆逐字重复十分钟前所说的话是不可行

InputStream就像你的朋友说话一样。你们俩都没有足够好的记忆力来准确地逐字记住所说的话。同样,生成数据流的进程和您的程序都没有足够的 RAM 来逐字节存储流。为了扩展,你的程序必须依赖它的“短期记忆”(RAM),在任何给定时间只处理整个流的一小部分,并在遇到时“记笔记”(写入持久存储)要点。

如果流的来源是本地文件,那就像你的朋友在看书一样。你们中的任何一个都可以轻松地重新阅读该内容。

如果您将流复制到某个持久存储,这就像录制您朋友的演讲一样。您可以随意重播。


考虑一个场景,浏览器正在上传一个大文件,但服务器很忙,并且有一段时间无法读取该流。在此延迟期间,这些数据存储在哪里?

因为接收者不能总是立即响应输入,所以 TCP 和许多其他协议分配一个小缓冲区来存储来自发送者的一些数据。但是,他们也有办法告诉发送者等待,他们发送数据的速度太快了——流量控制。回到这个类比,这就像告诉你的朋友在你做笔记的时候暂停片刻。

当浏览器上传文件时,首先会填充缓冲区。但是如果服务器跟不上,浏览器将被指示暂停上传,直到缓冲区中有更多空间。(这通常发生在操作系统和 TCP 级别;客户端和服务器应用程序不直接管理它。)上传速度取决于浏览器从磁盘读取文件的速度、网络链接的速度以及速度有多快服务器可以处理上传的数据。即使是快速的网络和客户端也会受到这个链条中薄弱环节的限制。

于 2016-07-13T17:20:09.757 回答