浏览JCA 1.7 specification我只能在他们的资源适配器Deployment Descriptor中的一个示例中找到以下内容(第13章:消息流入P 13-50):
此示例显示了UTF-8编码的用法,但是如果这是示例说明的可选选项或文件字符编码的必须限制,则没有任何说法。
我之所以这样问,是因为我正在编写Java程序来阅读其中一个文件而FindBugs™正在给我这样的信息:
DM_DEFAULT_ENCODING:依赖于默认编码 找到一个方法的调用,该方法将对String执行一个字节(或 字符串到字节)转换,并将假定为默认平台 编码是合适的。这将导致应用程序行为 因平台而异。使用备用API并指定charset 明确地命名或Charset对象。
此Java代码段中的第4行是指定字符编码的位置:
01. byte[] contents = new byte[1024];
02. int bytesRead = 0;
03. while ((bytesRead = bin.read(contents)) != -1)
04. result.append(new String(contents, 0, bytesRead));
那么,在这种情况下是否可以指定此文件的预期编码?
答案 0 :(得分:2)
从我看到的,大多数人使用UTF-8编码作为他们的ra.xml。但是,使用其他编码没有限制。因此,如果您的解析仅基于UTF-8,则结果可能与预期不符。
因此,当您将其作为普通文本阅读时,您需要在代码中对此进行计数,或将其作为xml文件读取并避免头痛。我不认为性能上的差异会成为一个问题,因为ra.xml文件通常不会增长到千兆字节。至少我到目前为止看到的平均只有几兆字节。
对于Findbug问题,您只需将编码指定为UTF-8即可。否则,您将使用在虚拟机启动期间确定的JVM的默认值,通常取决于底层操作系统的区域设置和字符集。虽然这里不推荐使用默认行为,但如果这是你想要的,那么只需指定默认编码的用法。这将摆脱Findbug问题。
所以你的代码看起来像这样:
01. byte[] contents = new byte[1024];
02. int bytesRead = 0;
03. while ((bytesRead = bin.read(contents)) != -1)
04. result.append(new String(contents, 0, bytesRead, Charset.defaultCharset()));
答案 1 :(得分:1)
FindBugs只是警告您,您依赖于默认的系统编码,因此,如果您的应用程序将由另一个国家/地区的其他用户启动,则可能会出现意外结果。最好明确指定要使用的编码。
在您的情况下,应从XML文件中提取实际编码。有几种方法可以获得它。一种方法是使用this回答中描述的XMLStreamReader
。