2011-01-20 5 views
2

org.apache.commons.io.FileUtils.copyFile (File, File)이 약간 다른 파일을 생성하는 문제가 있습니다. 이 파일들을 bsdiff 나 편집기에서 비교할 때, 나는 그것들이 다르다고 말할 수 있습니다. 특정 바이트가 물음표로 복사됩니다. 예를 들어, 0200 (8 진수)이? (077 8 진수).바이너리 파일은 JVM과 다르지만 다를 수 있습니까?

따라서 버그 보고서에 포함 할 테스트 사례를 만듭니다. 실행 파일의 복사본을 만든 다음 FileUtils.checksumCRC32 (File)를 사용하여 비교합니다. 예기치 않게 파일의 체크섬이 동일합니다. 그런 다음 각 파일의 FileInputStream을 반복하여 비교합니다. 이것은 또한 파일이 동일하다는 것을 주장합니다.

파일이 확실히 다릅니다. 하나는 실행되고 다른 하나는 실행되지 않습니다. bsdiff는 두 파일의 diff를 생성합니다. 내 눈으로 파일을 검사하여 특정 바이트가 잘못 복사되고 있음을 알 수 있습니다.

그러나 JVM의 경우 이러한 파일은 동일합니다. 왜 내가이 행동을 관찰하고 있는지에 대한 아이디어가 있습니까?

시스템 정보 : Windows 7, 64 비트; JVM 1.6.0_22, 32 비트

+0

당신이 생각하는 파일을 복사하지 않는 것처럼 들립니다. 파일이 텍스트 파일로 복사되고 이진 사본이 다른 곳으로 이동하는 것 같습니다. –

+0

또한 파일에서 md5sum.exe를 실행하십시오. 도구 (편집기, bsdiff)는 1 파일을 바이너리로, 다른 파일을 텍스트 파일로 혼동 할 수 있습니다 (예 : 파일 결말 또는 파일에 첨부 된 메타 데이터). – nos

답변

2

어, 미안 해요. Maven은 실행 파일을 '필터링'하여 Maven의 'target'디렉토리에 복사하기 전에 인코딩을 변경했습니다. 그런 다음 FileUtils는 'target'에서 대상으로 엉망인 실행 파일을 올바르게 복사하고있었습니다. 원본 디렉토리의 버전과 목적지의 버전을 비교했습니다.

+1

I 내가 할 수 있으면이 100 번이나. src/main/resources의 바이너리 파일과 똑같은 문제가있었습니다. 임시 파일에 복사했습니다. 나는 여전히이 게시물에 대한 답변을 찾지 않았을 것이다. 무리 감사. – eirirlar

1

이 프로그램은 가능한 모든 바이트를 쓰고 다시 읽습니다. 파일이 손상된 경우 Java가 이러한 바이트를 원래 값으로 되돌려 놓습니다. 즉 077이 0200이고 077이 아니라는 것을 어떻게 알 수 있습니까?

byte[] bytes = new byte[256]; 
for(int i=0;i<256;i++) 
    bytes[i] = (byte) i; 
FileUtils.writeByteArrayToFile(new File("tmp.dat"), bytes); 
byte[] bytes2 = FileUtils.readFileToByteArray(new File("tmp.dat")); 
System.out.println("equals "+Arrays.equals(bytes, bytes2)); 

파일 덤프가 표시됩니다.

od -x tmp.dat 
0000000 0100 0302 0504 0706 0908 0b0a 0d0c 0f0e 
0000020 1110 1312 1514 1716 1918 1b1a 1d1c 1f1e 
0000040 2120 2322 2524 2726 2928 2b2a 2d2c 2f2e 
0000060 3130 3332 3534 3736 3938 3b3a 3d3c 3f3e 
0000100 4140 4342 4544 4746 4948 4b4a 4d4c 4f4e 
0000120 5150 5352 5554 5756 5958 5b5a 5d5c 5f5e 
0000140 6160 6362 6564 6766 6968 6b6a 6d6c 6f6e 
0000160 7170 7372 7574 7776 7978 7b7a 7d7c 7f7e 
0000200 8180 8382 8584 8786 8988 8b8a 8d8c 8f8e 
0000220 9190 9392 9594 9796 9998 9b9a 9d9c 9f9e 
0000240 a1a0 a3a2 a5a4 a7a6 a9a8 abaa adac afae 
0000260 b1b0 b3b2 b5b4 b7b6 b9b8 bbba bdbc bfbe 
0000300 c1c0 c3c2 c5c4 c7c6 c9c8 cbca cdcc cfce 
0000320 d1d0 d3d2 d5d4 d7d6 d9d8 dbda dddc dfde 
0000340 e1e0 e3e2 e5e4 e7e6 e9e8 ebea edec efee 
0000360 f1f0 f3f2 f5f4 f7f6 f9f8 fbfa fdfc fffe 
관련 문제