通过字节块java比较两个文件

时间:2014-11-07 16:38:21

标签: java compare byte bytearray block

我尝试按字节块比较两个文件。逐块。但我的循环树有问题。

    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;
    }

是否有另一种方法可以按字节比较两个文件,并使用不同大小的块进行比较?

1 个答案:

答案 0 :(得分:1)

要比较文件的最后一个字节块,您的程序可以从微小的修改中受益。从最后一个块开始迭代块。更改了for子句如下,以便向后迭代。

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;
    }
}