Java序列化到不同流时输出不一致的原因排查
XML特殊字符输出异常问题排查
我遇到了XML特殊字符输出异常的问题,涉及的字符串是löööschee`*‘‘§a,XML以Java的XOM Object形式传入。排查时发现,使用XOM的Serializer打印XML文本,只有直接输出到System.out才能得到正确字符串。
所用打印代码如下:
Element pEntry; // this is the XOM object I get, it contains the xml Document document = pEntry.getDocument(); ByteArrayOutputStream stream = new ByteArrayOutputStream(); Serializer serializer = new Serializer(stream); Serializer serializer2 = new Serializer(System.out); try { serializer.write(document); serializer2.write(document); } catch (IOException e) { System.out.println(e.getMessage()); } System.out.println("#####################################################################"); System.out.println(stream);
异常现象
serializer2直接输出到System.out时字符串显示正常,但System.out.println(stream)输出的字符串为l??????schee`*????????a。我尝试过多种编码设置(Serializer默认编码为UTF-8,看起来是正确的),但只有直接输出到System.out能得到正确结果。
我打印了第一个流的字节,输出为:
6c ffffffc3 ffffffb6 ffffffc3 ffffffb6 ffffffc3 ffffffb6 73 63 68 65 65 60 2a ffffffe2 ffffff80 ffffff98 ffffffe2 ffffff80 ffffff98 ffffffc2 ffffffa7 61。
我知道c3 b6对应ö,这部分字节是正确的,但搞不懂前缀的ffffff是什么。
核心疑问
为什么使用相同编码,输出结果却不一样?
已尝试的操作
- 在javac命令中添加
-J-Dfile.encoding=UTF-8→ 无效果 - 用不同编码初始化Serializer(UTF-8、UTF-16、US-ASCII)→ 只有UTF-8能让serializer2输出正确,因此确认UTF-8是正确编码
- 将
System.out.println(stream)替换为以下代码:
→ 情况有所改善,字符串显示为l???schee`*?????aString xmlContent = stream.toString(StandardCharsets.UTF_8); System.out.println(xmlContent);
内容的提问来源于stack exchange,提问作者Michael Lamprecht
相关产品推荐
相关产品推荐

