PrintStream 和 PrintWriter的区别

       java 输出流中的PrintStream 和 PrintWriter有什么区别,好像不少场合都能混用
好比用于网络间通讯,发送消息时,可用PrintStream 也可用 PrintWriter
    eg:
         Socket client;
          PrintStream output = new PrintStream(client.getOutputStream());
          output.println("aaa");
          output.flush();
        把上例中的 PrintStream 换成 PrintWriter效果是同样的。Java I/O流分为两类,字节流和字符流。字节流是指InputStream/OutputStream及其子类,字符流是指Reader/Writer及其子类。这两类I/O流的class hierarchy基本上是对等的,InputStreamReader/OutputStreamWriter是InputStream/OutputStream和Reader/Writer之间的桥梁。

         PrintStream是OutputStream的子类,PrintWriter是Writer的子类,二者处于对等的位置上,因此它们的API是很是类似的。PrintWriter实现了PritnStream的全部print方法。对于PrintStream,全部println方法都在内部调用相应的print方法,好比println(char x)的方法体就是调用print(x);再写入一个平台相关的换行符。PrintStream构建时会在内部new一个BufferedWriter,全部print方法都在内部调用这个Writer的write方法(write(String)或write(char[]))——对于print(char[]),直接调用write(char[]);对于其余的print方法,先用String.valueOf得到参数的字符串表示,而后调用write(String)。
         对于PrintWriter,全部println方法也都在内部调用print方法,print方法调用write方法。传入OutputStream时,PrintWriter会在内部构造一个BufferedWriter;而传入Writer时,PrintStream内部直接使用该Writer,此时PrintWriter是否进行了缓冲全看该Writer。
因此,对于使用print系列方法的场合,两者没什么区别。java

         可是,PrintStream是字节流,它有处理raw byte的方法,write(int)和write(byte[],int,int);PrintWriter是字符流,它没有处理raw byte的方法。PrintStream和PrintWriter的auto flushing机制有点不一样,前者在输出byte数组、调用println方法、输出换行符或者byte值10(即\n)时自动调用flush方法,后者仅在调用println方法时发生auto flushing。

System.out是PrintStream。其实这些东西API文档中都有。数组

相关文章
相关标签/搜索