缓冲区下溢异常java

时间:2014-11-06 14:32:50

标签: java exception compare memory-mapped-files bytebuffer

我有一个类比较器,用不同的算法比较我的文件。 在这部分中,我尝试从文件中获取一个字节块以与另一个文件的块进行比较。

public class CompareFiles {

    private byte[] getBytesFromFile(File file) throws IOException {
    long BUFFER_SIZE = 4 * 1024;
    RandomAccessFile raf = new RandomAccessFile(file, "rw");
    FileChannel fc = raf.getChannel();
    MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_ONLY, 0, BUFFER_SIZE);
    byte[] bytes = new byte[(int) fc.size()];
    buffer.get(bytes);
    buffer.clear();
    return bytes;
    }
}

如果我尝试在大文件上使用一个

Exception in thread "main" java.nio.BufferUnderflowException
at java.nio.DirectByteBuffer.get(Unknown Source)
at java.nio.ByteBuffer.get(Unknown Source)

我想,我在脑海中犯了错误,并以错误的方式比较了积木。

1 个答案:

答案 0 :(得分:2)

问题是你是在一个小区域进行映射,例如4 KB,然后尝试读取整个文件,我猜这个文件超过4 KB。

顺便说一句,在finally块或try-with-resource块中完成文件后,应始终关闭文件。 buffer.clear();在这种情况下不做任何事情。

使用内存映射文件并避免需要将数据复制到byte []中的主要优点。如果需要一个byte [],只需将其直接读入byte []即可。如果您想要一个最佳解决方案,请尽量避免使用byte []。