2011-01-20 8 views
2

org.apache.commons.io.FileUtils.copyFile(File、File)がわずかに異なるファイルを生成している問題があります。私がこれらのファイルをbsdiffやエディタと比較すると、それらが異なっているとわかります。特定のバイトが疑問符としてコピーされています。たとえば、0200(8進数)は? (077オクタル)。バイナリファイルは異なりますが、JVMとは異なりますか?

したがって、バグレポートに含めるテストケースを作成します。実行可能ファイルのコピーを作成し、FileUtils.checksumCRC32(File)を使用して比較します。予期せず、ファイルには同じチェックサムがあります。次に、各ファイルのFileInputStreamを反復して比較します。これはまた、ファイルが同じであることを主張します。

ファイルは確かに異なります。 1つは実行され、もう1つは実行されません。 bsdiffは、2つのファイルのdiffを生成します。私は、特定のバイトが私の目でファイルを検査することによって間違ってコピーされていることを知ることができます。

ただし、JVMではこれらのファイルは同じです。なぜ私はこの行動を観察しているのすべてのアイデア?

システム情報: Windows 7,64ビット; JVM 1.6.0_22,32ビット

+0

あなたが思っているファイルをコピーしていないようです。ファイルがテキストファイルとしてコピーされ、バイナリコピーが別の場所にコピーされているようです。 –

+0

また、ファイル上でmd5sum.exeを実行すると、あなたのツール(エディタ、bsdiff)がバイナリに1つのファイルを混乱させるかもしれないし、テキストファイル(例えば、ファイルの終了やファイルに添付されたメタデータに基づく)を混乱させるかもしれません。 – nos

答えて

2

よろしくお願いいたします。 Mavenは実行可能ファイルを 'フィルタリング'していました。このファイルはMavenの 'target'ディレクトリにコピーする前にエンコードを変更しました。その後、FileUtilsは正しく実行された実行ファイルを 'target'から 'destination'にコピーしていました。私は自分のソースディレクトリのバージョンと宛先のバージョンを比較していました。

+1

もし私ができるなら、これを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 
関連する問題