我使用以下内容来比较两个假定相同的文件的内容。我读过——至少对于文本文件,如 TXT 或 HTML——文件的编码会影响文件的十六进制序列如何转换为字符:即,对于相同的十六进制序列,文件以 UTF 编码-8 将显示与 ASCII 编码不同的内容。文件编码会影响我下面的代码吗?或者不是,因为我正在比较基本字节级别的文件内容,不关心十六进制序列?
bin_1 = new BufferedInputStream(file_input_stream_1);
bin_2 = new BufferedInputStream(file_input_stream_2);
byte[] barr_1 = new byte[8192];
byte[] barr_2 = new byte[8192];
while(bin_1.available() > 0){
bin_1.read(barr_1); bin_2.read(barr_2);
if(Arrays.equals(barr_1, barr_2) == false){
break;
}
else{
barr_1 = new byte[8192];
barr_2 = new byte[8192];
continue;
}
}
...字节的基本级别,不涉及十六进制序列
我认为你在这里有一个误解。字节是 8 位的组,以十六进制表示以节省一些空间(例如 FF 相当于字节值 11111111)。所以这些本质上是相同的。
话虽这么说,是的编码会影响比较,因为字符可能表示为不同的字节。只要您的文本仅包含 ASCII 字符,通用编码就有可能产生相同的字节,因为 UTF-8 和 Latin-1 共享相同的基本序列。 但是,其他编码可能完全不同。 作为示例,使用文本“stackoverflow”。
拉丁语-1:
73 74 61 63 6B 6F 76 65 72 66 6C 6F 77
73 74 61 63 6B 6F 76 65 72 66 6C 6F 77
0073 0074 0061 0063 006B 006F 0076 0065 0072 0066 006C 006F 0077
,因此您需要相应地调整比较。这意味着以下十六进制序列基本上代表相同的内容:
无BOM:73 74 61 63 6B 6F 76 65 72 66 6C 6F 77
EF BB BF 73 74 61 63 6B 6F 76 65 72 66 6C 6F 77
嗯,你最好在字符级别上比较它们,因为 Java 在内部使用一种字符代码。但是,您需要知道文件的编码,以告诉 Java 在加载文件时如何将字节转换为字符 - 并且您可能仍然需要查找 UTF-8 BOM,因为 Java 很可能会尝试读取它作为角色。