Java FileUtils.readFileToByteArray vs Files.readAllBytes

Java FileUtils.readFileToByteArray vs Files.readAllBytes,java,file,byte,Java,File,Byte,当我使用java 7中的Files.readAllBytes时,我遇到了以下异常,然后使用apache中的FileUtils.readFileToByteArray解决了这个问题。我通过在stackoverflow中查看一些答案做出了那个决定。我试图通过阅读代码来了解解决此问题的主要区别,但徒劳无功。我只是想知道解决这个异常的这两个方面有什么不同 java.lang.OutOfMemoryError: Direct buffer memory at java.nio.Bits.res

当我使用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)
java.lang.OutOfMemoryError:直接缓冲内存
位于java.nio.Bits.reserveMemory(Bits.java:658)
位于java.nio.DirectByteBuffer。(DirectByteBuffer.java:123)
位于java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:306)
位于sun.nio.ch.Util.getTemporaryDirectBuffer(Util.java:174)
位于sun.nio.ch.IOUtil.read(IOUtil.java:196)
位于sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:143)
位于sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:65)
位于sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:109)
位于sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
位于java.nio.file.Files.read(Files.java:2903)
位于java.nio.file.Files.readAllBytes(Files.java:2953)

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



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

你应该真正使用
文件。readAllBytes()
,但是你的文件有多大?对我来说,你使用的是32位JVM和一个大的最大堆大小;我说的对吗?是的,甚至我觉得我们应该使用java.nio。我的文件大小从20MB到30MB不等。不,我使用的是64位JVM,我的堆大小设置为-Xmx512m.huh,这很奇怪;应该有足够的空间用于所谓的“直接”内存…增加堆大小在这里没有帮助。老实说,我很困惑。那是什么操作系统?如果是Linux,你能编辑你的问题并添加
ulimit-a
的输出作为运行程序的用户吗?我的操作系统是Windows 7,这篇文章怎么样,尤其是最后的评论。