我byte[]从一个文件中读取一个并将其转换为String:
byte[] bytesFromFile = Files.readAllBytes(...);
String stringFromFile = new String(bytesFromFile, "UTF-8");
Run Code Online (Sandbox Code Playgroud)
我想将此与byte[]我从Web服务获得的另一个进行比较:
String stringFromWebService = webService.getMyByteString();
byte[] bytesFromWebService = stringFromWebService.getBytes("UTF-8");
Run Code Online (Sandbox Code Playgroud)
所以我byte[]从一个文件中读取并将其转换为a String,然后String从我的Web服务获取并将其转换为byte[].然后我做了以下测试:
// works!
org.junit.Assert.assertEquals(stringFromFile, stringFromWebService);
// fails!
org.junit.Assert.assertArrayEquals(bytesFromFile, bytesFromWebService);
Run Code Online (Sandbox Code Playgroud)
为什么第二个断言失败了?
其他答案涵盖了一个可能的事实,即文件未UTF-8编码,从而导致了所描述的症状。
然而,我认为最有趣的方面不是断言byte[]失败,而是assert字符串值相同通过。我不是 100% 确定这是为什么,但我认为以下对源代码的搜索可能会给我们答案:
new String(bytesFromFile, "UTF-8");工作的——我们看到构造函数调用了StringCoding.decode()UTF-8字符集,则依次调用StringDecoder.decode()CharsetDecoder.decode()决定要做什么(我猜如果UTF-8出现非角色,就会出现这种情况)private CodingErrorAction unmappableCharacterAction
= CodingErrorAction.REPORT;
Run Code Online (Sandbox Code Playgroud)这意味着它仍然报告已解码的字符,即使它在技术上是不可映射的。
我认为这意味着即使代码获得不可映射的字符,它也会替换其最佳猜测 - 所以我猜测其最佳猜测是正确的,因此在String比较下表示是相同的,但byte[]不再相同。
这个假设得到了以下事实的支持: incatch的块 表示:CharacterCodingExceptionStringCoding.decode()
} catch (CharacterCodingException x) {
// Substitution is always enabled,
// so this shouldn't happen
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1031 次 |
| 最近记录: |