Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中以i18n友好的方式将格式化整数写入文件?_Java_File_Internationalization_Streamwriter_Filewriter - Fatal编程技术网

如何在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);
}