【问题标题】:Read/write file contents into/out of ArrayList<Byte> [closed]将文件内容读入/写出 ArrayList<Byte> [关闭]
【发布时间】:2015-08-05 19:20:35
【问题描述】:

我需要将一个非常大的文件 (1.11gb) 读入内存并以字节为单位进行处理。我这样做的唯一方法是使用 ArrayList (我不能使用 byte[] 因为那样它会超过限制)。 没有办法使文件更小(我用它来测试我的程序处理数据的时间)。 然后我需要将 ArrayList 作为文件放回硬盘驱动器(仍然是 1.11gb) 我不像阅读那样担心写作。 速度也很重要,因此除非有人有快速的方法,否则应避免子分段。

【问题讨论】:

  • 请解释:我不能使用字节[],因为那样会超出限制
  • ArrayList&lt;Byte&gt; 是 byte[] 在引擎盖下
  • @kaykay 不是,它是一个 Object[]。它使用的内存是字节数组的 4 或 8 倍。
  • @SotiriosDelimanolis 数组的最大长度为 2^31-1 个位置,这对我的程序来说太少了(它是一个文件操作程序)
  • 我投票结束这个问题,因为这是一个X-Y Problem。你没有解释为什么你想做你想做的事,这可能会导致一个更合适的解决方案。在每种情况下,我都认为这是在byte 级别处理文件的最幼稚和最糟糕的方式。

标签: java file arraylist


【解决方案1】:

你试图以错误的方式解决这个问题(它不会起作用1)。

解决这个问题的可能方法是:

  • 重新设计算法,使其需要一次性将整个文件读入内存。

  • 将数据读入多个byte[] 对象以绕过2^31 数组大小限制。

  • 使用多个ByteBuffer对象映射文件2;见Java MemoryMapping big files。


1 - 它不起作用,因为ArrayList 内部有一个Object[],因此受到与字节数组相同的限制。此外,ArrayList&lt;Byte&gt; 占用的内存是 byte[] 的 4 到 8 倍,表示相同的字节数。或者更多,如果你用错误方式实例化的Byte 对象填充ArrayList&lt;Byte&gt;。

2 - Buffer API 都使用 int 大小和偏移量,并且 (AFAIK) 不支持将 >= 2^31 字节的文件映射到单个 Buffer。

【讨论】:

    猜你喜欢
    • 2014-02-28
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    相关资源
    最近更新 更多