这是我用来从sdcard复制sharedpreference文件的代码。
File fileSrc = new File(filePath, "userdata.xml");
File fileDes = new File("/data/data/com.nik/shared_prefs/", "userdata.xml");
...
...
private void copyFile(File fileSrc, File fileDes) {
FileInputStream fileinputstream=null;
FileOutputStream fileoutputstream=null;
try {
fileinputstream = new FileInputStream(fileSrc);
fileoutputstream = new FileOutputStream(fileDes);
byte[] buffer = new byte[4096];
int count = 0;
while ((count = fileinputstream.read(buffer)) > 0) {
fileoutputstream.write(buffer, 0, count);
}
fileinputstream.close();
fileoutputstream.flush();
fileoutputstream.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
if(fileSrc.hashCode() == fileDes.hashCode()){
Log.d("Copy result: ", "Files Equal!");
} else {
Log.d("Copy result: ", "Files not Equal!");
}
if(fileSrc == fileDes){
Log.d("=>Copy result: ", "Files Equal!");
} else {
Log.d("=>Copy result: ", "Files not Equal!");
}
}
上面的代码成功运行并复制了该文件,但它始终显示“Files not Equal!”在日志。
如果我在资源管理器中打开文件,内容是相同的。那么为什么我会得到“文件不等于!”在这两种情况下......
编辑:
我创建了以下方法来创建文件的SHA-256哈希
private MessageDigest fileHash(File file) {
MessageDigest md=null;
try {
md = MessageDigest.getInstance("SHA-256");
FileInputStream fileinputstream = new FileInputStream(file);
byte[] dataBytes = new byte[1024];
int nread = 0;
while ((nread = fileinputstream.read(dataBytes)) != -1) {
md.update(dataBytes, 0, nread);
}
}
catch(IOException e) {
e.printStackTrace();
}
catch(NoSuchAlgorithmException e){
e.printStackTrace();
}
return md;
}
并用
调用它if(fileHash(fileSrc) == fileHash(fileDes)){
Log.d("=>Copy result: ", "Files Equal!");
} else {
Log.d("=>Copy result: ", "Files not Equal!");
}
我仍然得到“文件不等!”。
答案 0 :(得分:2)
File.hashCode()
返回从文件对象派生的哈希码,即基本上是文件名。它不会在磁盘上散列文件的内容。由于两个文件名不同,因此哈希码很可能也不同。
回答编辑: 您现在比较两个消息摘要对象,而不是文件的哈希值。由于对象不同,因此再次出现不相等。
相反,您应该从函数返回哈希值:
private byte[] fileHash(File file) {
...
return md.digest();
}
并将它们比作:
if (Arrays.equals(fileHash(fileSrc), fileHash(fileDes))) { ... }