我们如何修复findBugs报告的Reliance on default encoding
:
StringBuffer printData = getPrintData(data);
try {
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(new File(linkName)));
out.write(printData.toString());
out.flush();
final FileInputStream f = new FileInputStream(new File(linkName));
return f;
} catch (final IOException ioe) {
ioe.printStackTrace();
}
我正在使用StreamWriter
编写文件。
答案 0 :(得分:8)
您使用single argument构建OutputStreamWriter
。这意味着它将使用操作系统的默认编码将来自printData
(即Unicode)的Java字符串转换为字节流(文件输出),并且您可能会在不同的计算机上获得不同的结果,具体取决于它们的本地化设置。
例如,假设您的对象printData
包含日文文本。当人们在日本和美国的Windows上运行您的软件时,他们将获得写入文件的不同数据。美国用户可能会有问号(?)替换所有象形文字,而日本用户可能会保留原始日文字符的UTF-8文件。如果原始文本包含多种语言,则结果将更加难以预测。
您的应用程序可能接受也可能不接受,具体取决于它的作用以及数据的来源。这就是警告的内容。
如果您知道应用程序应该生成的文件编码,您可能希望在构造OutputStreamWriter
时明确选择它。另一方面,如果您希望将其翻译成机器的默认表示,请保持原样。