Java 二进制文件不同,但与JVM不同?

Java 二进制文件不同,但与JVM不同?,java,jvm,apache-commons-io,Java,Jvm,Apache Commons Io,我遇到了一个问题,org.apache.commons.io.FileUtils.copyFile(文件,文件)生成的文件略有不同。当我将这些文件与bsdiff或在编辑器中进行比较时,我可以看出它们是不同的。某些字节被复制为问号。例如,0200(八进制)被复制为?(077八进制) 因此,我创建了一个测试用例以包含在bug报告中。我制作了可执行文件的副本,然后使用FileUtils.checksumCRC32(文件)进行比较。出乎意料的是,这些文件具有相同的校验和。然后通过迭代每个文件的FileI

我遇到了一个问题,org.apache.commons.io.FileUtils.copyFile(文件,文件)生成的文件略有不同。当我将这些文件与bsdiff或在编辑器中进行比较时,我可以看出它们是不同的。某些字节被复制为问号。例如,0200(八进制)被复制为?(077八进制)

因此,我创建了一个测试用例以包含在bug报告中。我制作了可执行文件的副本,然后使用FileUtils.checksumCRC32(文件)进行比较。出乎意料的是,这些文件具有相同的校验和。然后通过迭代每个文件的FileInputStream来比较它们。这也表明文件是相同的

文件当然不同。一个跑,另一个不跑。bsdiff生成两个文件的diff。通过用眼睛检查文件,我可以看出某些字节被复制错了

但是,对于JVM来说,这些文件是相同的。你知道我为什么要观察这种行为吗

系统信息:
Windows7,64位;JVM 1.6.0_22,32位

此程序写入所有可能的字节,然后再次读取它们。如果文件被破坏,Java如何将这些字节转换回它们的原始值。i、 e.它怎么知道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));

呃,对不起大家。Maven正在“过滤”可执行文件,它在将其复制到Maven的“目标”目录之前更改了编码。然后FileUtils正确地将混乱的可执行文件从“目标”复制到目标。我正在将源目录中的版本与目标目录中的版本进行比较。

听起来您没有复制您认为是的文件。文件似乎是作为文本文件复制的,而您的二进制副本正在其他地方。此外,请对文件运行md5sum.exe-您的工具(编辑器,bsdiff)可能会以某种方式将一个文件混淆为二进制文件,而另一个文件混淆为文本文件(例如,基于文件结尾或附加到文件的元数据)。如果可以,我会将此混淆100次。我将src/main/resources中的二进制文件复制到一个临时文件时,遇到了完全相同的问题。如果不是因为这篇文章,我仍然在寻找答案。非常感谢。
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