gpt4 book ai didi

JavaIO : Reading a file that is still being written

转载 作者:行者123 更新时间:2023-11-30 03:22:55 28 4
gpt4 key购买 nike

我正在创建一个程序,需要从仍在写入的文件中读取。

主要问题是:如果使用在单独线程上运行的 InputStreamOutputStream 类执行读取和写入,有什么问题和问题为了防止数据损坏,我需要注意哪些边缘情况?

如果有人想知道我是否考虑过其他基于非InputStream的方法,答案是肯定的,我已经考虑过,但不幸的是,在这个项目中这是不可能的,因为该程序使用的库只能工作与InputStreamOutputStream

此外,一些读者问为什么需要这种复杂性。为什么文件写完后不进行读取?

原因是效率。该程序将执行以下操作

  1. 下载一系列字节 block ,每个字节 block 大小为 1.5MB。该程序将接收数千个此类 block ,总计可达 30GB。此外,为了最大化带宽, block 是同时下载的,因此它们可能会乱序到达
  2. 程序将在每个 block 到达后立即发送它们进行处理。请注意,它们将按顺序发送进行处理。如果 block m 在 block m-1 之前到达,它们将在磁盘上缓冲,直到 block m-1 到达并被发送进行处理。
  3. 从 block 0 到 block n 执行这些 block 的处理,直到处理完每个 block
  4. 将处理后的结果重新发回。

如果我们要等待整个文件传输完毕,这会给实时系统带来巨大的延迟。

最佳答案

使用RandomAccessFile。通过 getChannel 或类似的方式可以使用 ByteBuffer

您将无法“插入”或“删除”文件的中间部分。出于这样的目的,您原来的方法就可以了,但是使用两个文件。

对于并发性:为了保持同步,您可以维护文件的一个单一对象模型,并在那里进行更改。只有待处理的更改需要保留在内存中,其他分层数据可以根据需要重新读取和重新解析。

关于JavaIO : Reading a file that is still being written,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30910473/

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