2011-06-14 2 views
0

이것은 달성하고자하는 것입니다 : 1) zip 파일에 추가 할 모든 파일의 체크섬을 계산하십시오. 현재 IO는 다음 아파치 커먼스 사용 :자바에서 압축 해제 후 파일 검사 합계를 보존

final Checksum oChecksum = new Adler32(); 
... 

//for every file iFile in folder 
long lSum = (FileUtils.checksum(iFile, oChecksum)).getValue(); 
//store this checksum in a log 

2) 앤트 압축 작업을 사용하여 우편으로 처리 폴더 압축.

final Checksum oChecksum = new Adler32();  
... 
    ZipFile myZip = new ZipFile("test.zip"); 
    ZipArchiveEntry zipEntry = myZip.getEntry("checksum.log"); //reads the filename from the log 
    BufferedInputStream myInputStream = new BufferedInputStream(myZip.getInputStream(zipEntry)); 
    File destFile = new File("/mydir", zipEntry.getName()); 
    lDestFile.createNewFile(); 
    FileUtils.copyInputStreamToFile(myInputStream, destFile); 

long newChecksum = FileUtils.checksum(destFile, oChecksum).getValue(); 

I 가지는 문제는 값이다 : 3) 상기 추출 된 파일의 체크섬을 모두 가공 IO 및이를위한 압축)을 사용하여 (특정 폴더에 의해 압축 된 하나의 파일을 추출하고, 계산 newChecksum의 원본 파일과 일치하지 않습니다. 파일의 크기가 디스크에서 일치합니다. 재미있는 점은 터미널에서 두 파일 모두에 대해 cksum 또는 md5sum 명령을 직접 실행하면 두 파일에서 모두 동일하다는 것입니다. 불일치는 java에서만 발생합니다.

올바른 방법인가요? 아니면 추출 후 체크섬 값을 유지할 수있는 방법이 있습니까?

또한 CheckedInputStream을 사용하여 시도했지만이 또한 java에서 다른 값을 가져옵니다.

편집 : 이것은 사용 된 Adler32 개체 (사전 압축 대 압축 해제 검사)와 관련이있는 것으로 보입니다. 모든 Adler32를 재사용하는 대신 모든 파일의 압축 해제 검사에서 "new Adler32()"를 수행하면 올바른 결과를 얻습니다.

답변

1

모든 파일을 연결하려고합니까? 그렇다면 동일한 순서로 읽었는지 확인해야합니다. 아니요 인 경우 각 파일의 체크섬 계산간에 checksum.reset()을 호출해야합니다. Adler32가 상태 유지 (stateful)하다는 것을 알게 될 것입니다. 즉, 파트 1에서 파일의 체크섬과 앞의 모든 체크섬을 계산한다는 의미입니다.

+0

오른쪽 ... 이것은 전체적인 문제였습니다. 리셋을 사용하거나 새 인스턴스를 사용하면 원하는 것을 반환합니다. 감사! – Dan