gpt4 book ai didi

java - 用于存储来自文件输入 Java 的动态大小的 block 的最佳数据结构

转载 作者:行者123 更新时间:2023-12-01 13:16:10 24 4
gpt4 key购买 nike

我正在开发一个 Java 程序,我正在从动态的、未知的 block 中的文件中读取数据。也就是说,每个数据 block 的大小并不总是相同,并且大小是在读取数据时确定的。对于 I/O,我使用 MappedByteBuffer(文件输入约为 MB)。

我的目标:

  • 找到一种有效的方法来在输入阶段存储每个完整的 block ,以便我可以对其进行处理。

我的限制:

  • 我一次从缓冲区读取一个字节
  • 我的处理方法采用原始字节数组作为输入
  • 每个 block 都会在读取下一个 block 之前被处理

我尝试过的:

  • 我尝试过像列表这样的动态结构,但它们没有支持数组,而且到原始数组的转换时间让我很担心
  • 我也想过用String来存储每个 block ,然后用getBytes()来获取byte[],但是太慢了
  • 多次读取文件,先找到 block 大小,然后抓取相关字节

我正在尝试寻找一种不会违背快速 I/O 目的的方法。任何建议将不胜感激。

其他信息:

  • 我使用滚动哈希来决定 block 应该在哪里结束

这里有一些伪代码:

circular_buffer[] = read first 128 bytes
rolling_hash = hash(buffer[])
block_storage = ??? // this is the data structure I'd like to use
while file has more text
b = next byte
add b to block_storage
add b to next index in circular_buffer (if reached end, start adding/overwriting front)
shift rolling_hash one byte to the right
if hash has a certain characteristic
process block_storage as a byte[] //should contain entire block of data

如您所见,我一次读取一个字节,并重复存储/覆盖该一个字节。但是,一旦进入处理阶段,我希望能够访问 block 中的所有信息。 block 也没有预先确定的最大大小,因此我无法预分配。

最佳答案

在我看来,您需要一个动态增长的缓冲区。您可以使用内置的 BytaArrayOutputStream为了实现这一点。它会自动增长以存储写入其中的所有数据。您可以使用write(int b)toByteArray()实现将b添加到block_storage将block_storage作为byte[]处理

但是要小心 - 该流将无限增长。您应该围绕它实现一些健全性检查,以避免耗尽所有内存(例如,计算写入其中的字节数,并在超过合理数量时通过抛出异常来中断)。还要确保在消耗 block 后关闭并丢弃对流的引用,以允许 GC 释放内存。

编辑:正如@marcman指出的,缓冲区可以是 reset() .

关于java - 用于存储来自文件输入 Java 的动态大小的 block 的最佳数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22447410/

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