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