我有一个类比较器,用不同的算法比较我的文件。 在这部分中,我尝试从文件中获取一个字节块以与另一个文件的块进行比较。
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)
我想,我在脑海中犯了错误,并以错误的方式比较了积木。
答案 0 :(得分:2)
问题是你是在一个小区域进行映射,例如4 KB,然后尝试读取整个文件,我猜这个文件超过4 KB。
顺便说一句,在finally块或try-with-resource块中完成文件后,应始终关闭文件。 buffer.clear();
在这种情况下不做任何事情。
使用内存映射文件并避免需要将数据复制到byte []中的主要优点。如果需要一个byte [],只需将其直接读入byte []即可。如果您想要一个最佳解决方案,请尽量避免使用byte []。