2014-11-06 120 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();在這種情況下不做任何事情。

使用內存映射文件並避免需要將數據複製到一個字節[]的主要優點。如果你需要一個字節[],直接讀入一個字節[]。如果您想要最佳解決方案,請儘量避免使用字節[]。