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

Java 我应该使用PrintWriter包装BufferedWriter吗?,java,Java,在api中,java说,“除非需要提示输出,否则建议将BufferedWriter包装在任何write()操作可能代价高昂的Writer周围,例如FileWriter和OutputStreamWriter”。我多次尝试比较,结果表明,如果不使用PrintWriter包装BufferedWriter,时间会更短。 那么,这是否意味着,我不必包装在“控制台”上? 下面是我比较这两者的简单代码 public static void PrintWrite(String path, String cont

在api中,java说,“除非需要提示输出,否则建议将BufferedWriter包装在任何write()操作可能代价高昂的Writer周围,例如FileWriter和OutputStreamWriter”。我多次尝试比较,结果表明,如果不使用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();
    }
}
publicstaticvoidprintwrite(字符串路径、字符串内容)抛出IOException{
PrintWriter pw=新的PrintWriter(新的缓冲写入程序(新的文件写入程序(路径));
写(内容);
关闭();
}
公共静态void BufferedWrite(字符串路径、字符串内容)引发IOException{
BufferedWriter bw=新的BufferedWriter(新文件写入程序(路径));
写(内容);
bw.close();
}   
私有静态void main(字符串[]args)
{
字符串s=“”;
String path=“D:\\out.txt”;
对于(int i=0;i<10000;i++)
{
s+=“kjuatlistened”;
}
尝试
{
长启动=System.nanoTime();
//打印写入(路径,s);
BufferedWrite(路径,s);
long end=System.nanoTime();
println(“完成,经过”+(结束-开始)+“s”);
}
捕获(IOEX异常)
{
例如printStackTrace();
}
}

当您将一个对象包装到另一个对象中时,您肯定在添加一层处理

使用PrintWriter的主要原因是它具有丰富的方便功能,可以智能输出各种内容。如果你不需要这个功能,你根本就不会使用PrintWriter


BufferedWriter的作用是允许缓冲输出,然后成批写入。文件系统、Internet等的I/O成本很高,其中很大一部分成本是首先生成连接,然后等待每个I/O操作完成。如果对外部设备进行批处理I/O,则可以真正降低总体成本,因为可以对输出(或输入)进行批处理,并且每个批只等待一次完成,而不是每次I/O操作都等待一次。对于一个“有趣”的测试,请尝试一次一个字符地向您的FileWriter写入字符,然后使用BufferedWriter包装您的FileWriter执行相同的操作。我认为在后一种情况下,您会看到很大的改进。

我不完全理解您的潜在问题,但是

用PrintWriter包装BufferedWriter的速度要慢得多,因为它添加了一层调用


System.out和.err是PrintStream对象,而不是PrintWriter。这就是你所说的控制台吗?我很确定你不应该包装它们中的任何一个。

好吧,根据我所阅读和收集的信息,如果你需要更多的功能,那么就包装这个类。如果它在不包装类的情况下工作,并且您不需要包装类提供的其他方法,那么就不要包装该类。我读过很多关于这方面的混合观点,但从我收集的资料来看,只有当你需要包装类提供的更多功能时,包装类才会被完成(在大多数情况下)。不,doug hauf,我只是想知道为什么jdk说,从我的角度来说,包装类可能与不安全的东西有关,这是更好的。因为从我的测试来看,“wrap”使用了更多的时间…所以…我发布了这个问题…我对此感到困惑,因为为什么api说,建议使用PrintWriter包装BufferedWriter,但是,从我的测试来看,“warp”操作确实花费了更多的时间,所以这就是我困惑的地方。对不起…我不应该使用“console”参与。此外,我只是不明白为什么它会说“除非需要提示输出”,以及在什么情况下?如果您需要在编写时将输出准确地显示在最终输出流上,请不要使用BufferedWriter。BufferedWriter在将输出刷新到最终目的地之前,可以在其缓冲区中保留输出,只要它愿意。因此,在本上下文中,“提示输出”指的是“尽快出现在最终目的地的输出”,而不是“缓冲编写器想要写出时出现在最终目的地的输出”。明白了,我看到“PrintWriter”比“BufferedWriter”有更多的方法,这就是你的意思吗?非常感谢你的回答……是的——所有这些额外的方法都可以让你轻松地向流中写入各种内容。对于大多数编写器,您必须自己生成正确的字节序列。PrintWriter让这一切变得更容易。