FileUtils.readFileToByteArray 对比 Files.readAllBytes

FileUtils.readFileToByteArray vs Files.readAllBytes

当我使用 java 7 中的 Files.readAllBytes 时,我遇到了以下异常,然后使用 apache 中的 FileUtils.readFileToByteArray 解决了这个问题。我通过在 Whosebug 中查看几个答案做出了这个决定。我尝试通过浏览代码来了解可以解决此问题的主要区别,但没有成功。我只想知道解决这个异常的这两个有什么区别。

  java.lang.OutOfMemoryError: Direct buffer memory
    at java.nio.Bits.reserveMemory(Bits.java:658)
    at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
    at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:306)
    at sun.nio.ch.Util.getTemporaryDirectBuffer(Util.java:174)
    at sun.nio.ch.IOUtil.read(IOUtil.java:196)
    at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:143)
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
    at java.nio.file.Files.read(Files.java:2903)
    at java.nio.file.Files.readAllBytes(Files.java:2953)

好的,您可以使用此命令增加缓冲区大小。它可能会解决您的错误。

-XX:MaxDirectMemorySize=256M


我试着粗略地阅读了这两个源代码,我发现的不同之处在于 apache 方法并没有尝试读取所有文件并将其存储到内存中,而是先写入输出(这是他们的自己的 ByteArrayOutputStream) 实现是 ArrayList(所以你可以说他们使用了你通过 -Xmx 增加的内存 space)。另一个只是将所有内容存储到内存 space 中,这可能是您出错的原因。