java中PrintStream和PrintWriter的区别

我就是我 2022-10-01 02:00 241阅读 0赞

J ava 输出流中的PrintStream 和 PrintWriter有什么区别,好像很多场合都能混用。比如用于网络间通信,发送消息时,可用PrintStream 也可用 PrintWriter

  1. eg:
  2. Socket client;
  3. PrintStream output = newPrintStream(client.getOutputStream());
  4. output.println("aaa");
  5. output.flush();
  6. 把上例中的 PrintStream 换成 **PrintWriter**效果是一样的。JavaI/O流分为两类,字节流和字符流。字节流是指InputStream/OutputStream及其子类,字符流是指Reader/Writer及其子类。这两类I/O流的classhierarchy基本上是对等的,InputStreamReader/OutputStreamWriterInputStream/OutputStreamReader/Writer之间的桥梁。
  7. PrintStreamOutputStream的子类,**PrintWriter**是Writer的子类,两者处于对等的位置上,所以它们的API是非常相似的。**PrintWriter**实现了PritnStream的所有print方法。对于PrintStream,所有println方法都在内部调用相应的print方法,比如println(charx)的方法体就是调用print(x);再写入一个平台相关的换行符。PrintStream构建时会在内部new一个BufferedWriter,所有print方法都在内部调用这个Writerwrite方法(write(String)或write(char\[\]))——对于print(char\[\]),直接调用write(char\[\]);对于其他的print方法,先用String.valueOf获得参数的字符串表示,然后调用write(String)。
  8. 对于**PrintWriter**,所有println方法也都在内部调用print方法,print方法调用write方法。传入OutputStream时,**PrintWriter**会在内部构造一个BufferedWriter;而传入Writer时,PrintStream内部直接使用该Writer,此时**PrintWriter**是否进行了缓冲全看该Writer

所以,对于使用print系列方法的场合,二者没什么区别。

  1. 但是,PrintStream是字节流,它有处理rawbyte的方法,write(int)和write(byte\[\],int,int);**PrintWriter**是字符流,它没有处理rawbyte的方法。PrintStream和**PrintWriter**的autoflushing机制有点不同,前者在输出byte数组、调用println方法、输出换行符或者byte10(即\\n)时自动调用flush方法,后者仅在调用println方法时发生autoflushing
  2. System.out.println()就是调用的PrintStreamprintln方法。这里的out就是printstream对象,println方法会自动清空缓存,write方法也会根据是否是autoflush来清空缓存。最终虚拟机会调用Writerwrite方法(具体是调用其实现abstractwrite方法的子类)。

from:http://blog.sina.com.cn/s/blog\_4c875beb010008g8.html

发表评论

表情:
评论列表 (有 0 条评论,241人围观)

还没有评论,来说两句吧...

相关阅读