如何在Java中以i18n友好的方式将格式化整数写入文件?
我目前正在使用如何在Java中以i18n友好的方式将格式化整数写入文件?,java,file,internationalization,streamwriter,filewriter,Java,File,Internationalization,Streamwriter,Filewriter,我目前正在使用 try { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("open_sites_20,txt"), "UTF-8")); writer.write(String.format("%4d%4d%n", i, j)); writer.close(); }
try {
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("open_sites_20,txt"), "UTF-8"));
writer.write(String.format("%4d%4d%n", i, j));
writer.close();
} catch (IOException e) {
System.err.print("error: " + e.toString() + "\n");
};
其中i,j是整数
FindBugs报告说,上述情况有以下不良做法
Reliance on default encoding
Found a call to a method which will perform a byte to String (or String to byte) conversion, and will assume that the default platform encoding is suitable. This will cause the application behaviour to vary between platforms. Use an alternative API and specify a charset name or Charset object explicitly.
有什么可以改进的建议吗
平台:IntelliJ IDEA 13.1.1+FindBugs IDEA 0.9.992。在这种情况下,FindBugs似乎是错误的。请记住,它的规则不是一成不变的,所以有必要运用你自己的判断 至于改进方面。您几乎没有办法改进这段代码。首先,让我们来处理字符编码。自Java 1.4以来,
OutputStreamWriter
具有以下签名:
OutputStreamWriter(OutputStream stream, Charset charEncoding)
最好使用它,而不是将编码名称作为字符串传递。为什么?从Java7开始,可以使用enum创建Charset
类实例。因此,你可以写:
new OutputStreamWriter(new FileOutputStream("open_sites_20,txt"), StandardCharsets.UTF_8)
我不认为FindBugs会为此争论
我在这里看到的另一个问题,是你关闭writer的方式。在某些情况下,不会调用此方法。处理此问题的最佳方法(如果您使用的是Java 7及以上版本)是使用并让Java关闭streams/Writer:
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream("open_sites_20,txt"), StandardCharsets.UTF_8));) {
writer.write(String.format("%4d%4d%n", i, j));
// It always make sense to flush the stream before closing
writer.flush();
} catch (IOException e) {
System.err.print("error: " + e.toString() + "\n");
};
现在,您所要做的就是将单个值写入文件。如果我是你,我会尽量避免创建流的所有开销,用编写器包装流等等。这很复杂。幸运的是,Java 7有一个极好的类来帮助您将内容写入文本文件:。该类有两个方法,当您需要将某些内容写入文本文件时,它们非常有用:
write(Path path, byte[] bytes, OpenOption... options)
write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options)
就这样朴素典雅。我在这里用的是:
- -我不能保证FindBugs不会抱怨这个
- -而是将异常写入System.out
OutputStreamWriter
时,您已经指定了编码。FindBugs报告问题的确切位置是哪里?就在BufferedWriter…
的行上。如果FindBugs在您指定的行上报告问题,那么FindBugs似乎不正确。要么它被某个流的一些内部实现细节所抛弃,要么它只是在警告方面非常随意,要么你在FindBugs中发现了一个bug。
try {
Path outputPath = Paths.get("open_sites_20,txt");
String nmbrStr = String.format("%4d%4d%n", i, j);
byte[] outputBytes = nmbrStr.getBytes(StandardCharsets.UTF_8));
Files.write(outputPath, outputBytes, StandardOpenOption.CREATE);
} catch (IOException ioe) {
LOGGER.severe(ioe);
}