Java 检查两个(大)文件之间的差异

Java 检查两个(大)文件之间的差异,java,hash,backup,diff,Java,Hash,Backup,Diff,我想写一个相对简单的程序,它可以将文件从我的计算机备份到远程位置,并在备份过程中对它们进行加密,同时还可以计算一个差异(不是真的……我很满意看到是否有任何变化,而不是变化太大)在本地和远程文件之间查看哪些文件已更改,哪些文件需要更新 我知道有非常好的程序可以做到这一点(rsync或其他基于双重性的程序)。我不是想重新发明轮子,只是想给自己一次学习的经历 我的问题是关于项目的不同部分。我做了一些假设,并编写了一些示例代码来测试它们,但我想知道您是否看到了我可能遗漏的任何内容,假设是否完全错误,或者

我想写一个相对简单的程序,它可以将文件从我的计算机备份到远程位置,并在备份过程中对它们进行加密,同时还可以计算一个差异(不是真的……我很满意看到是否有任何变化,而不是变化太大)在本地和远程文件之间查看哪些文件已更改,哪些文件需要更新

我知道有非常好的程序可以做到这一点(rsync或其他基于双重性的程序)。我不是想重新发明轮子,只是想给自己一次学习的经历

我的问题是关于项目的不同部分。我做了一些假设,并编写了一些示例代码来测试它们,但我想知道您是否看到了我可能遗漏的任何内容,假设是否完全错误,或者在特定的关联中是否有可能出错

假设1:如果文件长度不相等,则它们不能相同(即,必须进行了一些修改)
假设2:如果两个文件相同(即未进行任何修改),则这两个文件的任何字节子集将具有相同的哈希值
假设3:如果发现两个文件的字节子集不产生相同的哈希,则两个文件不相同(即已修改)

代码是用Java编写的,使用的哈希算法是使用来自Marc Greim的
\u File1
\u File2
是类型为
java.io.File

public boolean compareStream() throws IOException {
    int i = 0;
    int step = 4096;
    boolean equal = false;

    FileInputStream fi1 = new FileInputStream(_File1);      
    FileInputStream fi2 = new FileInputStream(_File2);

    byte[] fi1Content = new byte[step];
    byte[] fi2Content = new byte[step];

    if(_File1.length() == _File2.length()) { //Assumption 1
        while(i*step < _File1.length()) {   

            fi1.read(fi1Content, 0, step); //Assumption 2
            fi2.read(fi2Content, 0, step); //Assumption 2

            equal = BLAKE512.isEqual(fi1Content, fi2Content); //Assumption 2

            if(!equal) { //Assumption 3
                break;
            }

            ++i;
        }
    }

    fi1.close();
    fi2.close();
    return equal;
}
public boolean compareStream()引发IOException{
int i=0;
int step=4096;
布尔相等=假;
FileInputStream fi1=新的FileInputStream(_File1);
FileInputStream fi2=新的FileInputStream(_File2);
字节[]fi1Content=新字节[步骤];
字节[]fi2Content=新字节[步骤];
如果(_File1.length()==_File2.length()){//1
而(i*step<_File1.length()){
图1.读取(图1内容,0,步骤);//假设2
图2.read(图2内容,0,步骤);//假设2
equal=BLAKE512.isEqual(图1内容,图2内容);//假设2
如果(!equal){//3
打破
}
++一,;
}
}
图1.关闭();
图2.关闭();
回报相等;
}
计算两个相等的1.5 GB文件大约需要4.2秒。当文件不同时,时间当然要短得多,特别是当它们的长度不同时,因为它会立即返回

感谢您的建议:)

…我希望这不是太宽泛

虽然假设是正确的,但它们不会防止罕见的误报(当方法说文件是相等的,而它们不是相等的):

假设2:如果两个文件相同(即未进行任何修改),则任何字节子集将具有相同的哈希值


这是正确的,但由于哈希冲突,您可能会遇到这样的情况,即块的哈希相同,但块本身不同。

不要太宽。。。这是一个很好的问题,但却离题了。。。检查啊,好主意!我不知道,谢谢!你实际上没有提出问题。是的。问题是:我的假设错了吗?你看到我可能遗漏了什么吗?你有没有看到在某些情况下会出现可怕的错误。。。但正如Jordi所说,这可能更适合codereview,我在codereview上发布了这个问题:。正在标记为关闭,因为与主题无关