下面是我们需要了解的知识
l 包装类的概念与作用
l BufferedInputStream与BufferedOutputStream类
l DataInputStream与DataOutputStream类
首先我们先看一下过滤流(包装类)的概念与作用
这里需要澄清一点,这里所说的包装类可不是Java中像Integer,Char等这些包装类,这里所说的包装类和过滤流其实是一码事,过滤流就类似于包装类的作用。
过滤流的主要特点是在输入与输出数据的同时能对所传输的数据做指定类型或格式的转换,即可实现对二进制字节数据的理解和编码转换。
现在让你通过FileOutputStream对象将一个浮点小数写入到文件中,你感觉有点困难吧?能否通过FileOutputStream对象直接将一个整数写入到文件呢?这就需要过流流来进行想的处理了。
下面我们首先来看一下过滤流的一种,BufferedInputStream和BufferedOutputStream
之前在介绍FileInputStream和FileOutputStream的例子中,使用了一个byte类型的数组来作为数据读入的缓冲区,以文件读取微粒,硬盘存取的速度远低于内存中的数据存取速度。为了减少队硬盘的存取,通常从文件中一次读入一定长度的数据,而写入时也是一次写入一定长度的数据,这样可以增加文件存取的效率。
BufferedInputStream和BufferedOutputStream从字面理解也就是缓冲的意思,确实这两个类就可以为InputStream、OutputStream类的对象增加缓冲区的功能。
BufferedInputStream的数据成员buf是一个位数组,默认为2048字节。当读取数据来源时,例如文件,BufferedInputStream会尽量将buf装满。当使用read()方法时,实际上是先读取buf中的数据,而不是直接对数据来源作读取。当buf中的数据不足时,BufferedInputStream才会再实现给定的InputStream对象的read()方法,从指定的装置中读取数据。如下图所示:
而BufferedOutputStream的数据成员buf也是一个位数组,默认为512字节。当使用write()方法写入数据时,实际上会先将数据写至buf中,当buf已满时才会实现给定的OutputStream对象的write()方法,将buf数据写至目的地,而不是每次都对目的地作写入的动作。
需要注意的是BufferedInputStream和BufferedOutputStream并没有改变InputStream或OutputStream的行为,读入或写出时的动作还是InputStream和OutputStream负责。BufferedInputStream和BufferedOutputStream只是在操作对应的方法之前动态的为它们加上一些额外的缓冲区的功能。
接着我们再来看一下DataInputStream与DataOutputStream
DataInputStream与DataOutputStream可提供一些对Java基本数据类型写入或输出的方法,就像读写int、double和boolean等的方法。由于Java的数据类型的大小是规定好的,在写入或输出这些基本数据类型时,就不用担心不同平台间数据大小不同的问题。
同样的,DataInputStream与DataOutputStream类并没有改变InputStream或OutputStream的行为,读入或写出时的动作还是InputStream和OutputStream负责。DataInputStream与DataOutputStream只是在实现对应的方法时,动态的为它们加上类型判断功能。
最后我们来编写一个程序,分别使用DataOutputStream中提供给的writeUTF、writeBytes和writeChars方法,比较这几个方法的差异。程序所使用的流栈如下:
程序àDataoutputStreamàBufferedOutputStreamàFileOutputStreamà文件
DataAndBufferedTest
package com.richer.io; import java.io.*; public class DataAndBufferedTest { public static void main(String[] args) throws IOException { //输出 FileOutputStream fos = new FileOutputStream("test.txt"); BufferedOutputStream bos = new BufferedOutputStream(fos); DataOutputStream dos = new DataOutputStream(bos); dos.writeUTF("richer中国"); dos.writeBytes("richer中国"); dos.writeChars("richer中国"); dos.close(); //关闭流栈中的最上层的流对象,将会自动关闭流栈中的所有底层流对象。 //读取 FileInputStream fis = new FileInputStream("test.txt"); BufferedInputStream bis = new BufferedInputStream(fis); DataInputStream dis = new DataInputStream(bis); System.out.println(dis.readUTF()); //utf byte[] buffer = new byte[1024]; int length = dis.read(buffer); System.out.println(new String(buffer,0,length)); fis.close(); } }
大家可以运行该程序,对比生成的文本文件来比较差异性。
版权声明: 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。