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()代码>在这种情况下不起任何作用 使用内存映射文件和避免将数据复制到字节[]的主要优点。如果您需要一个字节[],只需将其直接读入一个字节[]。如果需要最佳解决方案,请尽量避免使用字节[]