相信这句话,存在必然有其道理。
我承认OutputStream有你所说的这些方法,但是我们必须要看看OutputStream的定义,查看API,其定义是这样的public [color=Red]abstract[/color] class OutputStreamextends Objectimplements Closeable, Flushable ,我们看到红色标出来的关键字,可以看出OutputStream是抽象类,不能直接实例化,而必需有子类,让子类对象来实例化它,而子类可以增加父类没有的功能,比如缓冲区功能啊等等,这样子类也就可以拥有你所说的那些方法。再来看看OutputStream的继承结构
--java.lang.Object
---java.io.OutputStream
--java.io.FilterOutputStream
--java.io.BufferedOutputStream
很明显我们可以看出BufferedOutputStream是OutputStream的子类,这样BufferedOutputStream就可以当做OutputStream对象来使用了。还有为什么我们要这样定义类的层次结构呢?首先要明白为什么要使用抽象类而不使用接口,抽象类表现的是一种is a 的关系,而接口表现是like a一种关系。输出流有各种各样的底层实现,也就出现各种各样的流,比如说缓冲流,对象流等等,但归结到底是一种流,所以把OutputStream定义成抽象类再恰当不过了,因为类之间的关系表现出一种是的关系。所以通过继承Outputstream类可以构造出不同的流。
你所说的BufferedOutputStream只不过是OutputStream中的一个子类,他比父类有更多的功能,该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统,这样也就提高的效率是不?所以用它非常有意义。 |