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

时间:2014-03-17 05:12:53

标签: java arrays file-io data-structures bytebuffer

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

我的目标:

  • 找到一种在输入阶段存储每个完整块的有效方法,以便我可以处理它。

我的约束:

  • 我从缓冲区一次读取一个字节
  • 我的处理方法将原始字节数组作为输入
  • 在读取下一个块之前处理每个块

我尝试过的事情:

  • 我玩过像Lists这样的动态结构,但他们没有支持数组,原始阵列的转换时间让我感到担忧
  • 我还考虑过使用String来存储每个块,然后使用getBytes()来获取byte [],但它很慢
  • 多次读取文件以便首先找到块大小,然后获取相关字节

我试图找到一种不会破坏快速I / O目的的方法。任何建议都将不胜感激。

其他信息:

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

这里有一些伪代码:

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

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

1 个答案:

答案 0 :(得分:1)

在我看来,你需要一个动态增长的缓冲区。您可以使用内置的BytaArrayOutputStream来实现这一目标。它将自动增长以存储写入其中的所有数据。您可以使用write(int b)toByteArray()来实现add b to block_storageprocess block_storage as a byte[]

但请注意 - 这条小溪将无限增长。你应该在它周围实现一些健全性检查,以避免耗尽所有内存(例如,写入它的计数字节,并在超过合理数量时抛出异常)。还要确保在使用块后关闭并丢弃对流的引用,以允许GC释放内存。

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