在Java中PrintWriter write()方法在哪里写入数据

时间:2017-08-20 07:36:25

标签: java

import java.io.File;  
import java.io.PrintWriter;  
public class PrintWriterExample {  


    public static void main(String[] args) throws Exception {  
             //Data to write on Console using PrintWriter  
      PrintWriter writer = new PrintWriter(System.out);    
      writer.write("Hello World");        
System.out.write(65);
System.out.write(' ');
System.out.flush();
System.out.close();

// writer.flush();  
  //writer.close();  

    }  
}  

我无法理解write()方法。它的描述说它将指定的字节写入此流。这条流'是什么意思?在哪里写的?某种缓冲? 将System.out作为参数传递给PrintWriter类构造函数意味着什么? 在这段代码里,我的数据是缓冲的吗?当我使用writer.write()和System.out.write()时是否创建了一些临时内存? 此外,当我试图评论和取消注释随机和关闭方法时,我得到的结果让我感到困惑。在这个特定的实例中为什么不会" Hello World"即使我已经冲洗并关闭缓冲区,也会在屏幕上打印出来。如果你说缓冲区不同,那么当我取消注释writer.flush()和writer.close()时,我也得到相同的结果。

1 个答案:

答案 0 :(得分:1)

System.outPrintStream,又称OutputStream,因此您正在调用PrintWriter(OutputStream out)构造函数。

相当于使用以下参数调用PrintWriter(Writer out)

new BufferedWriter(new OutputStreamWriter(out))

出于性能原因注入BufferedWriter

  

我的数据缓存在哪里?

BufferedWriter

  

为什么不打印“Hello World”

"Hello World"文本位于该缓冲区中,由于您从未刷新writer,因此永远不会向下游发送到System.out打印流。

  

System.out作为参数传递给PrintWriter类构造函数是什么意思?

这意味着写入PrintWriter的任何文字都会转发到System.out。正如javadoc所说:这个便利构造函数创建了必要的中间OutputStreamWriter,它将使用默认字符编码将字符转换为字节

  

当我取消注释writer.flush()和writer.close()时,我也得到相同的结果。

那是因为你已经关闭了System.out,所以它不再接受任何输出。 PrintWriter默默地忽略了您尝试时抛出的错误。正如javadoc所说:此类中的方法永远不会抛出I / O异常,尽管它的一些构造函数可能会。客户端可以通过调用checkError()来查询是否发生了任何错误。

<强>解决方案

致电close()会自动致电flush(),因此您无需在flush()之前致电close()

close()上拨打PrintWriter会自动拨打close()上的System.out,因此您无需这样做。

删除System.out.flush();System.out.close();writer.flush();,然后只调用writer.close();

更好的是,您通常不应该关闭System.out,所以只需致电writer.flush();,然后将其打开。