Java 按字节块比较两个文件

Java 按字节块比较两个文件,java,compare,byte,bytearray,block,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 {

我试图通过字节块比较两个文件。一块一块。但是我的循环树有问题

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

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

要比较文件的最后一个字节块,您的程序可能会从较小的修改中受益。从最后一个块开始迭代块。将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;
    }
}
import java.lang.Math;
导入java.nio.channels.FileChannel;
导入java.io.File;
导入java.io.IOException;
导入java.io.RandomAccessFile;
导入java.nio.MappedByteBuffer;
公共类比较
{
公共静态最终整型块大小=1024;
公共布尔比较(文件file1、文件file2)
{
//File file1=arrayOfFiles.get(i);
//File file2=arrayOfFiles.get(y);
布尔值等于=file1.length()!=file2.length();
对于(int z=getSizeInBlocks(file1)-1;等于&0