当我使用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)
答案 0 :(得分:0)
好吧,您可以使用此命令增加缓冲区大小。它可以解决您的错误。
我试着粗略地读了两个源代码,我发现的差异是apache方法不是试图读取所有文件并将其存储到内存中,而是首先写入输出(这是他们自己的实现ByteArrayOutputStream
的{{1}}对于ArrayList
(所以你可以说他们使用了你通过-Xmx
增加的记忆空间)。而另一个只是将所有内容存储到一个内存空间,这可能是你的错误的原因。