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

标签 java arrays file-io data-structures bytebuffer

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

相关文章:

java - 从 Eclipse 运行 Tomcat 时避免 Permgen Space 错误

java - 如何检索根据其标记的帖子数量排序的 Collection 夹标签列表?

java - 使用 ReSTLet 设置自定义内容范围 header

java - 在 Java 中用数组显示统计信息

java - 遍历目录,读入文件,并将它们打印到 html 文件中

java - 从文本文件读取单个字符时遇到问题

java - 为什么所有内容都从我的数组列表中删除?

c++ - 为什么我的迷宫解算器不起作用?

sql - array_agg() 函数的返回类型

java - 列出文件夹和子文件夹的文件路径