让我们先看看 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());
}
仅当环境的默认编码为 unicode 时,文件 pwfw.txt 才会包含 unicode 字符 omega。所以你会有与FileWriter 一样的限制(对于编码)。
如果你必须使用FileWriter 或PrintWriter 取决于你的需要。我相信PrintWriter 大部分时间都应该这样做。