OutputStream 类实现关系

OutputStream是输出字节流,具体的实现类层次结构如下:

OutputStream 抽象类

OutputStream 类重要方法设计如下:

底层源码

梳理部分OutputStream及其实现类的源码分析。

OutputStream

OutputStream抽象类源码如下:

JDK11的空对象模式

举个例子:

然后便可以始终可以这么调用,而不用再判断空了

FilterOutputStream

FilterOutputStream 源码如下

对比下JDK8中,close方法是没有加锁处理的。这种情况下你可以看JDK8源码中,直接利用java7的try with resources方式,优雅的调用flush方法后对out进行关闭。

ByteArrayOutputStream

ByteArrayOutputStream 源码如下

BufferedOutputStream

BufferedOutputStream 源码如下

BufferedOutputStream的flush和close方法的区别:

  • flush()方法:用来刷新缓冲区,刷新后可以再次写出

  • close()方法

    • 用来关闭流释放资源

    • 如果是带缓冲区的流对象的close()方法,不但会关闭流,close()方法还调用了flush()方法,也就是说,在关闭流之前会执行最后一次flush()