浅谈PrintStream和PrintWriter的区别和联系

2020-03-09 18:01:36丽君

也就是说,这句new PrintStream( new BufferedOutputStream( new FileOutputStream("BasicFileOutput.out")));实际上会产生五个流对象(装饰器模式会套五层,禁止套娃!)。看write函数,每次写入字符串时,竟然是先通过装饰器最外层的BufferedWriter进行的写入,然后再执行BufferedWriter、OutputStreamWriter的flushBuffer函数把字符转换为字节(像挤牙膏一样,只不过这是从外往里挤),并且将字节弄到this对象里面。

PrintStream的三种类型(File、OutputStream、String)的构造器都可以带字符集。


我们随便看一个带字符集的构造器,发现字符集被设置在this的外面一层流上,所以通过OutputStreamWriter向this传递字节数组时,这个字节数组就已经经过了特定字符集charset的encode了:

 private PrintStream(boolean autoFlush, OutputStream out, Charset charset) {
    super(out);
    this.autoFlush = autoFlush;
    this.charOut = new OutputStreamWriter(this, charset);
    this.textOut = new BufferedWriter(charOut);
  }

PrintWriter相比PrintStream多了一种类型的构造器(File、OutputStream、String、Writer),那就是它还可以接受一个Writer。

二者的方法分析

对比二者的api文档,你会发现前面的方法签名,这二者都是一模一样,除了后面的write方法们,所以我们只看不同的部分。相同的部分占大部分,同学们可以自行查看。

PrintStream的write方法们

从方法的描述也可以看出,这些write方法都是针对byte或者byte[ ]的。

发现有一个write方法是从FilterOutputStream继承而来,因为这个重载版本的write方法PrintStream没有去重写父类方法(下面这两个就是重写了FilterOutputStream了的)。


FilterOutputStream的write(byte[] b)版本如下:

PrintWriter的write方法们

从方法的描述也可以看出,这些write方法都是针对char或者string的。

到此这篇关于浅谈PrintStream和PrintWriter的区别和联系的文章就介绍到这了,更多相关PrintStream和PrintWriter区别内容请搜索易采站长站以前的文章或继续浏览下面的相关文章希望大家以后多多支持易采站长站!