【问题标题】:The proper uses of a print writer and file writer打印机和文件写入器的正确使用
【发布时间】:2016-09-28 09:05:46
【问题描述】:

既然可以直接使用打印写入器,为什么还要使用文件写入器,然后用打印写入器包装?我们使用缓冲读取器,因此它们可以一次读取大量数据,但是为了打印输出,我们必须将它们循环到 while 循环中,为什​​么我们没有更简单的方法来打印输出?

【问题讨论】:

  • 谁告诉你你should ... use file writer and then wrap it with a print writer
  • 嗯,那是不是就没有这个需求了?这就是我的老师昨天在教授印刷作家时的声音。可能我全都错了。谢谢。
  • 一般来说肯定是there is no such need。例外是可能的。 ;-) 请查看我的答案以获取更详细的示例以显示差异。
  • 您对循环的反对意见是什么,或者您对没有循环的解决方案的看法是什么?
  • 没有异议,实际上为了得到一行作为输出,我们使用了 readLine(),所以我认为必须有一些代码来读取整个文档并将其作为输出提供,仅此而已当然使用循环并不复杂,但我想可能是我不知道任何特定的代码。

标签: java bufferedreader java-io filewriter printwriter


【解决方案1】:

让我们先看看 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 的机器上运行 sn-p(或以 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());
}

仅当环境的默认编码为 un​​icode 时,文件 pwfw.txt 才会包含 unicode 字符 omega。所以你会有与FileWriter 一样的限制(对于编码)。

如果你必须使用FileWriterPrintWriter 取决于你的需要。我相信PrintWriter 大部分时间都应该这样做。

【讨论】:

  • 谢谢!我现在完全清楚了。再次感谢您的照明。有时,小事情总是在你的脑海中挥之不去,你无法继续阅读其他章节,上面就是其中之一。
  • @vidya 不客气。这是我的荣幸。提出问题并不可耻(即使它可能看起来很简单),但是(在我看来)停止学习是错误的。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 2018-09-03
  • 1970-01-01
  • 2013-04-03
  • 2013-06-18
相关资源
最近更新 更多