我应该使用PrintWriter来包装BufferedWriter吗?

时间:2014-03-04 18:31:54

标签: java

在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();
    }
}

enter image description here

2 个答案:

答案 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。这就是控制台的意思吗?我很确定你不应该包装其中任何一个。