我正在开发一个 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/