2014-03-01 2 views
0

이것은 sdcard에서 sharedpreference 파일을 toand fro로 복사하는 데 사용하는 코드입니다.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!"); 
} 
} 

위의 코드는 성공적으로 실행되고 파일을 복사하지만 항상 "파일이 같지 않음!"이라고 표시됩니다. 로그에.

파일을 탐색기에서 열면 내용이 동일합니다. 그렇다면 왜 "파일이 같지 않습니다!" 두 경우에 .....

편집 :

내가 파일

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

같은 ... inputstream 및 outputstream을 열고, 데이터를 읽고 비교 .. 파일의 해시를 얻고 비교할 다른 sinple 방법이 있습니까 ?? –

관련 문제