简体   繁体   中英

Compare two files by byte blocks java

I try to compare two files by byte blocks. Block by block. But I have a problem with my loop-tree.

    public void compare() {
        File file1 = arrayOfFiles.get(i);
        File file2 = arrayOfFiles.get(y);
        if (file1.length() != file2.length()) {
            break;
        }
        else
        {
            for (int z = 0; ; z++) {
                byte[] b1 = getParts(file1, z);
                byte[] b2 = getParts(file2, z);
                if (b1.length != b2.length) {
                    break;
                }
                else
                {
                    for (int x = 0; ; x++) {
                        if (b1[x] != b2[x]) {
                            break;
                        }
                        else
                        {
                            //how can I find the end of file? and compare last [x] of b1 and b2?
                        }
                    }
                }
            }
        }
    }

    private static byte[] getParts(File file, int z) throws IOException {
        byte [] bytes = new byte[1024];
        int point = z * 1024;
        RandomAccessFile raf = new RandomAccessFile(file, "r");
        FileChannel fc = raf.getChannel();
        MappedByteBuffer buffer = fc.map(FileChannel.MapMode.READ_ONLY, point, 1024);
        buffer.get(bytes);
        buffer.clear();
        return bytes;
    }

Is there another way to compare two files by bytes and do it with block of different size?

To compare last byte block of files your program could benefit from minor modification. Start iterating blocks from the last block. Changed the for clauses as following to iterate backwards.

import java.lang.Math;
import java.nio.channels.FileChannel;
import java.io.File;
import java.io.IOException; 
import java.io.RandomAccessFile; 
import java.nio.MappedByteBuffer;

public class Compare
{
    public static final int BLOCK_SIZE = 1024;

    public boolean compare(File file1, File file2)
    {
        //File file1 = arrayOfFiles.get(i);
        //File file2 = arrayOfFiles.get(y);
        boolean equal = file1.length() != file2.length();
        for (int z = getSizeInBlocks(file1) - 1; equal && 0 <= z ; z--)
        {
            MappedByteBuffer b1 = getParts(file1, z);
            MappedByteBuffer b2 = getParts(file2, z);
            if (b1.remaining() != b2.remaining())
            {
                equal = false;
                break;
            }
            else
            {
                for (int x = getBlockSize() - 1; equal && 0 <= x; x--) 
                {
                    if (b1[x] != b2[x])
                    {
                        equal = false;
                        break;
                    }
                    else
                    {
                        //how can I find the end of file? and compare last [x] of b1 and b2?
                    }
                }
            }
        }
        return equal;
    }

    private static int getSizeInBlocks(File file)
    {
        return (int) Math.ceil((double)getBlockSize()/file.length());
    }

    private static int getBlockSize()
    {
        return BLOCK_SIZE;
    }

    private static ByteBuffer getParts(File file, int z)
        throws IOException 
    {
        int point = z * getBlockSize();
        RandomAccessFile raf    = new RandomAccessFile(file, "r");
        FileChannel      fc     = raf.getChannel();
        MappedByteBuffer buffer = fc.map(
                                    FileChannel.MapMode.READ_ONLY, 
                                    point, 
                                    getBlockSize());
        return buffer;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM