Java-文件到字节数组-快速

Java-文件到字节数组-快速,java,Java,我想把一个文件读入一个字节数组。因此,我使用以下方法阅读: int len1 = (int)(new File(filename).length()); FileInputStream fis1 = new FileInputStream(filename); byte buf1[] = new byte[len1]; fis1.read(buf1); 然而,它确实非常慢。有人能告诉我一个非常快速的方法(可能是最好的方法)将文件读入字节数组吗。如果需要,我也可以

我想把一个文件读入一个字节数组。因此,我使用以下方法阅读:

    int len1 = (int)(new File(filename).length());
    FileInputStream fis1 = new FileInputStream(filename);
    byte buf1[] = new byte[len1];
    fis1.read(buf1);
然而,它确实非常慢。有人能告诉我一个非常快速的方法(可能是最好的方法)将文件读入字节数组吗。如果需要,我也可以使用java库


编辑:是否有更快的基准测试(包括库方法)。

ApacheCommons ioFileUtils.readFileToByteArray

它不是很慢,至少没有办法让它更快。但这是错误的。如果文件足够大,方法
read()
将不会返回第一次调用的所有字节。此方法将其管理读取的字节数作为返回值返回

正确的方法是在循环中调用此方法:

  public static void copy(InputStream input,
      OutputStream output,
      int bufferSize)
      throws IOException {
    byte[] buf = new byte[bufferSize];
    int bytesRead = input.read(buf);
    while (bytesRead != -1) {
      output.write(buf, 0, bytesRead);
      bytesRead = input.read(buf);
    }
    output.flush();
  }
将其称为:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
copy(new FileInputStream(myfile), baos);
byte[] bytes = baos.toByteArray();
类似的内容在很多包中都有实现,例如@Andrey Borisov(+1)提到的
FileUtils.readFileToByteArray()

编辑


我认为,在您的案例中,缓慢的原因是您创建了如此巨大的数组。你确定你真的需要它吗?试着重新思考你的设计。我相信您不必将此文件读入数组,并且可以增量处理数据

有多慢?哪一部分比较慢?就我个人而言,我没有意识到它非常慢。和什么相比慢?你确定这不是一个感觉到的缓慢的情况吗?在这种情况下,解决方案是尝试不一次性读取整个文件,并考虑逐块处理它?@MarkoTopolnik,读取1616007480字节需要15-20秒。最后一行很慢:)亚历山德罗:考虑购买SSD驱动器。让我们看看…15秒内达到1.5GB。。。哇,这是100MB/s!太快了!在内部,这个方法调用copyLarge(InputStream输入,OutputStream输出)-所以应该更好=:)apache commons io也使用它自己的ByteArrayOutputSteam。来自docs->这是java.io.ByteArrayOutputStream类的替代实现。最初的实现在开始时只分配32个字节。因为这个类是为重载设计的,所以它从1024字节开始。与原始版本不同,它没有重新分配整个内存块,而是分配额外的缓冲区。这样就不需要对缓冲区进行垃圾收集……请注意如何将2个参数传递给copy方法,该方法有3个参数。