DataInputStream与ObjectInputStream有点相似,能够通过一些readXXX方法读取基本类型的数据,这是非常实用的一些方法。假设我们即想使用BufferedInputStream读取效率高的特性。又想是想DataInputStream中的readXXX方法怎么办呢?非常easy,例如以下代码所看到的:
InputStream is = getInputStreamBySomeway(); BufferedInputStream bis = new BufferedInputStream(is); DataInputStream dis = new DataInputStream(bis);然后我们就能够调用dis.readXXX()等方法,即快又方便,这就是FilterInputStream子类通过构造函数层层传递结合在一起使用多种特性的魅力。与之相相应的是BufferedOutputStream和DataOutputStream,BufferedOutputStream优化了write方法。提高了写的效率。DataOutputStream具有非常多writeXXX方法。能够方便的写入基本类型数据。假设想使用writeXXX方法,还想提高写入到效率,能够例如以下代码使用,与上面的代码差点儿相同:
OutputStream os = getOutputStreamBySomeway(); BufferedOutputStream bos = new BufferedOutputStream(); DataOutputStream dos = new DataOutputStream(bos);然后在调用dos.writeXXX方法时效率就已经提高了。
BufferedInputStream & BufferedOutputStream
如上面所介绍的那样,在BufferedInputStream的构造函数中须要传入一个InputStream, BufferedInputStream内部有一个字节数组缓冲区,每次运行read操作的时候就从这buf中读取数据,从buf中读取数据没有多大的开销。假设buf中已经没有了要读取的数据,那么就去运行其内部绑定的InputStream的read方法,并且是一次性读取非常大一块数据,以便填充满buf缓冲区。缓冲区buf的默认大小是8192字节,也就是8K,在构造函数中我们也能够自己传入一个size指定缓冲区的大小。由于我们在运行BufferedInputStream的read操作的时候。非常多时候都是从缓冲区中读取的数据,这样就大大降低了实际运行其指定的InputStream的read操作的次数,也就提高了读取的效率。与BufferedInputStream 相对的是BufferedOutputStream。在BufferedOutputStream的构造函数中我们须要传入一个OutputStream。这样就将BufferedOutputStream与该OutputStream绑定在了一起。
BufferedOutputStream内部有一个字节缓冲区buf,在运行write操作时。将要写入的数据先一起缓存在一起,将其存入字节缓冲区buf中,buf是有限定大小的,默认的大小是8192字节,即8KB,当然也能够在构造函数中传入size指定buf的大小。该buf仅仅要被指定了大小之后就不会自己主动扩容,所以其是有限定大小的,既然有限定大小,就会有被填充完的时刻,当buf被填充完成的时候会调用BufferedOutputStream的flushBuffer方法,该方法会通过调用其绑定的OutputStream的write方法将buf中的数据进行实际的写入操作并将buf的指向归零(能够看做是将buf中的数据清空)。假设想让缓存区buf中的数据理解真的被写入OutputStream中。能够调用flush方法。flush方法内部会调用flushBuffer方法。由于buf的存在。会大大降低实际运行OutputStream的write操作的次数,优化了写的效率。
下面是BufferedInputStream 和 BufferedOutputStream的演示样例代码片段:
上面的代码将从file1.txt读取文件输入流。然后将读到的数据写入到file2.txt中。即实现了将file1.txt复制到file2.txt中。事实上不通过BufferedInputStream 和 BufferedOutputStream也能够完成这种工作,使用这个两个类的优点是,能够对file1.txt的读取以及file2.txt的写入提高效率,从而提升文件拷贝的效率。