2014-11-06 87 views
1

我有一个类比较器,比较我的文件与不同的算法。 在这部分我尝试从文件中获取一个字节块,以便与另一个文件的块进行比较。缓冲区下溢异常java

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) 

我猜,我犯错,我的心灵,让以错误的方式比较块。

回答

2

问题是你在一个小区域(例如, 4 KB,然后试图读取整个文件,我猜想是超过4 KB。

顺便说一句,你应该总是关闭一个文件,一旦你在一个finally块或者用try-with-resource块完成它。 buffer.clear();在这种情况下不做任何事情。

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