Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 缓冲区下溢异常_Java_Exception_Compare_Memory Mapped Files_Bytebuffer - Fatal编程技术网

Java 缓冲区下溢异常

Java 缓冲区下溢异常,java,exception,compare,memory-mapped-files,bytebuffer,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")

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

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)

我猜,我在头脑中犯了错误,以错误的方式得到了比较块

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

顺便说一句,在finally块或try-with-resource块中完成文件后,应该始终关闭该文件<代码>缓冲区.clear()在这种情况下不起任何作用

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