FileUtils.readFileToByteArray vs Files.readAllBytes

时间:2015-04-02 06:40:07

标签: java file byte

当我使用java 7中的Files.readAllBytes然后通过使用来自apache的FileUtils.readFileToByteArray解决时,我遇到了下面的异常。我在stackoverflow中通过几个答案来做出这个决定。我通过查看代码来尝试理解,以了解可以解决这个问题的主要区别但是徒劳无功。我只是想知道解决这个例外的这两个区别。

  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)

1 个答案:

答案 0 :(得分:0)

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

-XX:MaxDirectMemorySize=256M


我试着粗略地读了两个源代码,我发现的差异是apache方法不是试图读取所有文件并将其存储到内存中,而是首先写入输出(这是他们自己的实现ByteArrayOutputStream的{​​{1}}对于ArrayList(所以你可以说他们使用了你通过-Xmx增加的记忆空间)。而另一个只是将所有内容存储到一个内存空间,这可能是你的错误的原因。