How can I efficiently compare two binary files for equality?
Created May 4, 2012
Brian O'Byrne An option which I have used, and found to be reasonably performant, is to read the files in blocks into byte arrays and use equals() to compare the blocks.
Something like this:
It's not fancy, but I think when you want speed simple is good.
Something like this:
private final static int BLOCK_SIZE = 65536; // vary BLOCK_SIZE to suit yourself. // it should probably a factor or multiple of the size of a disk sector/cluster. // Note that your max heap size may need to be adjused // if you have a very big block size or lots of these comparators. // assume inputStreamA and inputStreamB are streams from your two files. byte[] streamABlock = new byte[BLOCK_SIZE]; byte[] streamBBlock = new byte[BLOCK_SIZE]; boolean match; do { int bytesReadA = inputStreamA.read(streamABlock); int bytesReadB = inputStreamB.read(streamBBlock); match = ((bytesReadA == bytesReadB) && bytesReadA.equals(bytesReadB)); } while (match && (bytesReadA > -1));
It's not fancy, but I think when you want speed simple is good.