【发布时间】:2015-06-18 08:42:35
【问题描述】:
我正在创建一个需要从仍在写入的文件中读取的程序。
主要问题是:如果读取和写入将使用在单独线程上运行的 InputStream 和 OutputStream 类执行,我需要注意哪些问题和边缘情况为了防止数据损坏?
如果有人想知道我是否考虑过其他不基于InputStream 的方法,答案是肯定的,我有,但不幸的是,在这个项目中这是不可能的,因为该程序使用的库仅适用于InputStream 和OutputStream.
另外,一些读者问为什么这种复杂性是必要的。文件写完后为什么不读呢?
原因是效率。该程序将执行以下操作
- 下载一系列每个 1.5MB 的字节块。该程序将收到数千个这样的块,总大小可达 30GB。此外,为了最大化带宽,块会同时下载,因此它们可能会乱序到达。
- 程序将在每个块到达后立即发送它们进行处理。请注意,它们将按顺序送去处理。如果块 m 在块 m-1 之前到达,它们将被缓冲在磁盘上,直到块 m-1 到达并被发送处理。
- 从块 0 到块 n 执行这些块的处理,直到处理完每个块
- 重新发回处理后的结果。
如果我们要等待整个文件传输完毕,将会给本应是实时系统的系统带来巨大的延迟。
【问题讨论】:
-
我更想知道您为什么考虑同时读取和写入同一个文件。当然可以,但它会打开一堆潜在问题的蠕虫。
-
Jägermeister 是对的。仅仅因为库与
Input/OutputStreams一起使用并不意味着您需要同时读取和写入文件。 -
@Kayaman 请查看我更新的帖子。
-
@Jägermeister 请查看我更新的帖子。另外,这些潜在问题究竟是什么?
-
@lolski 在内存中进行此处理是否有意义?由于您显然不需要在开始处理之前拥有整个 30GB,因此您似乎可以分块处理数据。如果库仅使用流,您始终可以创建自己合适的实现。您的示例代码并没有真正提供太多信息,因此很难提出一个体面的建议。
标签: java scala inputstream outputstream