当前位置: 首页 > 面试题库 >

Byte []和java.lang.OutOfMemoryError读取文件

狄新立
2023-03-14
问题内容

我正在尝试编写一个按位读取文件的读取器,但是大文件有问题。我试图读取100 mb的文件,它花了3分钟多的时间,但是仍然有效。

但是,然后我尝试使用500 mb的文件,但它甚至没有启动。由于这一行:

byte[] fileBits = new byte[len];

现在,我正在寻找解决方案,但找不到任何解决方案。也许有人解决了它,可以分享一些代码,技巧或想法。

if (file.length() > Integer.MAX_VALUE) {
    throw new IllegalArgumentException("File is too large: " + file.length());
}

int len = (int) file.length();
FileInputStream inputStream = new FileInputStream(file);

try {
    byte[] fileBits = new byte[len];
    for (int pos = 0; pos < len;) {
        int n = inputStream.read(fileBits, pos, len - pos);
        if (n < 0) {
            throw new EOFException();
        }
        pos += n;
    }

inputStream.read(fileBits, 0, inputStream.available());
inputStream.close();

问题答案:

我建议您尝试使用内存映射。

FileChannel fc = new FileInputStream(file).getChannel();
MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_ONLY, 0, (int) fc.size());

这将使整个文件几乎立即可用(大约10毫秒),并且几乎没有堆使用。BTW文件必须小于2 GB。



 类似资料:
  • 问题内容: 我正在尝试从URL(带有java包 **java.net.URL** )读取图像 到byte []。“所有内容”都可以正常工作,只不过不是从流中精心地读取内容(图像已损坏,它不包含所有图像数据)…字节数组一直保存在数据库(BLOB)中。我真的不知道正确的方法是什么,也许你可以给我一个小贴士:) 这是我的第一种方法(代码格式化,删除了不必要的信息…): 我的第二种方法是这种方法(您将看到

  • 当我试图从一个23MB的xlsx文件中读取、格式化和写入一行时,我面临着OutOfMemoryError。我有一个只格式化文件头的要求。 一点成功都没有。 我看过一些使用XSSFReader、SXSSFWorkbook的示例,但它不能解决我的情况,因为我需要覆盖这一行,所以我认为我真的需要一个工作簿。 有人使用Apache POI和大xlsx文件实现了读写操作吗? PS:如果解决方案是生成另一个文

  • 我们目前正在开发云数据流上的概念验证Apache Beam管道。我们将一些文件(没有文本;自定义二进制格式)放入Google Cloud Buckets,并希望将这些文件作为byte[]读取,并在流中反序列化它们。但是,我们找不到能够读取非文本文件的波束源。唯一的想法是扩展类,但我们认为应该有一个更简单的解决方案,因为这听起来是一个非常简单的任务。 谢谢你们的帮助。

  • 我想将一个byte[]中的一系列字节转换为一个字符串,以追加到文本文件中。然后,当拉出字符串时,我想将其转换回Byte[]以对其进行解码。我知道我不能使用,我需要将字符串复制到它的原始byte[]格式,然后解码回一个可读的字符串。这可能吗? 然后,我将字符串传递给另一个类,在这个类中,我需要将其作为字节读取,而不是更改为其字节形式。

  • null 如果我的理解有误,请指正。还有以下问题: 我的理解是,Hadoop中的文件读/写没有任何并行性,它所能执行的最佳操作与传统的文件读或写(即,如果复制设置为1)+分布式通信机制中涉及的一些开销是一样的。 并行性仅在数据处理阶段通过Map Reduce提供,而不是在客户端读/写文件期间提供。

  • 问题内容: 我有一些带有时间信息的文本文件,例如: 现在,我需要文件的第三列来计算平均值。 我怎样才能做到这一点?我需要获取所有文本行,然后获取最后一列? 问题答案: 您可以阅读通过线使用的文件中的行或,甚至一些其他techinique。使用扫描仪非常简单,如下所示: 要使用定义的分隔符分割字符串,可以使用split方法,该方法将正则表达式作为参数,并按与该表达式匹配的所有字符序列分割字符串。就您