为什么我们应该使用文件编写器,然后在我们可以直接使用打印编写器时用打印编写器将其包装?我们使用缓冲读取器,这样他们可以一次读取大块数据,但是为了得到打印输出,我们必须将它们循环到while循环中,为什么我们没有更简单的方法来打印输出?
答案 0 :(得分:2)
让我们首先看一下主要差异的javadoc。
用于编写字符文件的便捷类。该类的构造函数假定默认字符编码... FileWriter用于编写字符流。
将对象的格式化表示形式打印到文本输出流。
这意味着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
相同的限制(对于编码)。
如果您必须使用FileWriter
或PrintWriter
,则视您的需要而定。我相信PrintWriter
大部分时间都应该这样做。