正确使用打印编写器和文件编写器

时间:2016-05-30 13:46:08

标签: java bufferedreader java-io filewriter printwriter

为什么我们应该使用文件编写器,然后在我们可以直接使用打印编写器时用打印编写器将其包装?我们使用缓冲读取器,这样他们可以一次读取大块数据,但是为了得到打印输出,我们必须将它们循环到while循环中,为什​​么我们没有更简单的方法来打印输出?

1 个答案:

答案 0 :(得分:2)

让我们首先看一下主要差异的javadoc。

FileWriter

  

用于编写字符文件的便捷类。该类的构造函数假定默认字符编码... FileWriter用于编写字符流。

PrintWriter

  

将对象的格式化表示形式打印到文本输出流。

这意味着FileWriter侧重于字符输出,您无法定义字符编码。而PrintWriter侧重于格式化文本输出,您可以指定字符编码。

找一个小例子作为演示

// we need this as there is no convenient method to output a platform
// specific line separator charcater(s)
String newLine = System.getProperty("line.separator");
try (FileWriter fw = new FileWriter("/tmp/fw.txt")) {
    fw.append('\u2126').append(newLine);
    fw.write(65);
    fw.append(newLine);
    fw.append(String.format("%10s: %s%n", "some", "value"));
    fw.append("some line").append(newLine);
} catch (IOException ex) {
    System.err.println("something failed: " + ex.getMessage());
}
// the println() methods will append the right platform specific line separator
// charcater(s)
try (PrintWriter pw = new PrintWriter("/tmp/pw.txt", "UTF8")) {
    pw.append('\u2126');
    pw.println();
    pw.write(65);
    pw.println();
    pw.printf("%10s: %s%n", "some", "value");
    pw.println("some line");
} catch (FileNotFoundException | UnsupportedEncodingException ex) {
    System.err.println(ex.getMessage());
}

如果您在识别unicode的计算机上运行代码段(或运行代码为java -Dfile.encoding=UTF-8 ...),则输出将为

fw.txt

Ω
A
      some: value
some line

pw.txt

Ω
A
      some: value
some line

对于上面的例子,代码和结果看起来或多或少相同。 PrintWriter提供格式化输出的方法,而对于FileWriter,您必须在输出之前进行格式化。

但是当您的环境不能识别unicode(或将代码作为java -Dfile.encoding=ISO-8859-1 ...运行)时,差异很大

fw.txt

?
A
      some: value
some line

无法使用ISO8859-1编码打印unicode omega字符。

使用PrintWriter我们为输出定义了字符编码。这与环境的默认编码无关。

pw.txt

Ω
A
      some: value
some line

回到你的问题。将FileWriter包含到PrintWriter中。有可能的。但是你放弃了主要的好处,即选择字符编码的能力。

try (PrintWriter pw = new PrintWriter(new FileWriter("/tmp/pwfw.txt"))) {
    pw.append('\u2126');
    pw.println();
} catch (IOException ex) {
    System.err.println("something failed: " + ex.getMessage());
}

仅当环境的默认编码为unicode时,文件pwfw.txt才会包含unicode字符omega。因此,您将拥有与FileWriter相同的限制(对于编码)。

如果您必须使用FileWriterPrintWriter,则视您的需要而定。我相信PrintWriter大部分时间都应该这样做。