在api中,java说'除非需要提示输出,否则建议将BufferedWriter包装在任何write()操作可能代价高昂的Writer周围,例如FileWriters和OutputStreamWriters'。我多次尝试比较事实证明,如果我不使用PrintWriter来包装BufferedWriter,那么花费更少的时间。 这是否意味着,我不必包装在'控制台'上? 我的简单代码可以比较两者。
public static void PrintWrite(String path, String content) throws IOException {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(path)));
pw.write(content);
pw.close();
}
public static void BufferedWrite(String path, String content) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter(path));
bw.write(content);
bw.close();
}
private static void main(String[] args)
{
String s = "";
String path = "D:\\out.txt";
for (int i = 0; i < 10000; i++)
{
s += "kjuatlistened";
}
try
{
long start = System.nanoTime();
//PrintWrite(path,s);
BufferedWrite(path,s);
long end = System.nanoTime();
Printer.println("done,elapse " + (end - start) + " s");
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
答案 0 :(得分:0)
当你将一个对象包装在另一个对象中时,你肯定会添加一层处理。
使用PrintWriter的主要原因是丰富的便利功能,可以智能输出各种东西。如果您不需要该功能,则根本不会使用PrintWriter。
BufferedWriter的目的是允许缓冲输出然后批量写入。文件系统,因特网等的I / O成本很高,并且该成本的很大一部分是首先生成连接,然后在每个I / O操作完成时等待。如果您将I / O与外部设备进行批处理,则可以真正降低总体成本,因为可以对输出(或输入)进行批处理 - 并且您最终只等待每批完成一次,而不是每次I / O操作一次。对于“有趣”测试,尝试一次一个地将字符写入FileWriter,然后使用包装FileWriter的BufferedWriter执行相同的操作。我认为在后一种情况下你会看到很大的进步。
答案 1 :(得分:0)
我不完全理解你的根本问题,但是......
使用PrintWriter包装BufferedWriter几乎要慢一点,因为它添加了一层调用。
System.out和.err是PrintStream对象,而不是PrintWriter。这就是控制台的意思吗?我很确定你不应该包装其中任何一个。