gpt4 book ai didi

java - 两次读取输入流而不将其存储在内存中

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:09 25 4
gpt4 key购买 nike

引用stackoverflow question据说可以通过InputStream提供的mark()reset()多次读取InputStream > 或使用 PushbackInputStream

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

当文件大小超过内存大小时会发生什么?我认为这可能为 OutOfMemoryException 铺平道路。

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

请帮助我了解这一点。提前致谢。

最佳答案

这取决于流的来源。

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

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


也许打个比方会有所帮助。假设你的 friend 正在和你长谈。你不间断地仔细听,但当他们听完后,你意识到你不理解他们在开头所说的内容,并想复习那部分。

此时,有几种可能性。

也许您的 friend 实际上正在大声朗读一本书。您可以简单地重新阅读这本书。

或者,也许你不得不先见之明来记录他们的独白。您可以重放录音。

但是,由于您和您的 friend 都没有完美和无限的记忆,因此仅凭内存逐字重复十分钟前说过的话不是一种选择。

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

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

如果您将流复制到某个持久性存储,那就像录制您 friend 的演讲。您可以随时重播它。


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

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

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

关于java - 两次读取输入流而不将其存储在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38357951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com