2014-03-01 61 views
0

這是我用來從sdcard複製sharedpreference文件來回的代碼。爲什麼File.hashCode()不同

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!」在日誌中。

如果我在資源管理器中打開文件,內容是相同的。那麼爲什麼我會得到「文件不等於!」在這兩種情況下.....

編輯:

我創建了下面的方法來創建一個文件

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

的SHA-256散列與

if(fileHash(fileSrc) == fileHash(fileDes)){ 
Log.d("=>Copy result: ", "Files Equal!"); 
} else { 
Log.d("=>Copy result: ", "Files not Equal!"); 
} 
稱它爲

仍然得到「文件不等於!」。

回答

2

File.hashCode()返回從文件對象派生的哈希碼,即基本上是文件名。它不會將文件的內容散列在磁盤上。由於這兩個文件名稱不同,所以哈希碼也有不同的可能性。

編輯的答案: 您現在比較兩個消息摘要對象,而不是文件的散列。由於對象是不同的,你再次得到不平等。

相反,你應該從函數返回的散列總和:

private byte[] fileHash(File file) { 
    ... 
    return md.digest(); 
} 

和他們這樣的比較:

if (Arrays.equals(fileHash(fileSrc), fileHash(fileDes))) { ... } 
+0

那麼有沒有什麼方法可以檢查這兩個文件是相同的內容.. -明智的。 –

+0

@NiktheGeeK:是的 - 你閱讀文件的內容......(作爲第一遍,檢查長度,然後開始從兩個文件讀取,*邏輯*逐字節(但可能是緩衝區),並比較字節。) –

+0

like ...打開inputstream和outputstream,讀取數據並比較..是否沒有其他的方法來獲取文件的哈希值並進行比較? –