FileInputStream是InputStream的子类,由名称上就可以知道, FileInputStream主要就是从指定的档案中读取资料至目的地。 FileOutputStream是OutputStream的子类,顾名思义,FileInputStream主要就是从来源地写入资料至指定的档案中。 标准输入输出串流物件在程式一开始就会开启,但只有当您建立一个FileInputStream或FileOutputStream的实例时,实际的串流才会开启,而不使用串流时,也必须自行关闭串流,以释放与串流相依的系统资源。
下面这个程式可以复制档案,程式先从来源档案读取资料至一个位元缓冲区中,然后再将位元阵列的资料写入目的档案:
- FileStreamDemo.java
BufferedInputStream 与 BufferedOutputStream
在介绍 FileInputStream、 FileOutputStream的例子中,您使用了一个阵列来作为资料读入的缓冲区,以档案存取为例的话,您知道磁碟存取的速度是远低于记忆体中的资料存取速度,为了减少对磁碟的存,您一次读入一定长度的资料,如上一个主题范例中的1024位元组,而写入时也是一次写入一定长度的资料,这可以增加资料存取的效率。
BufferedInputStream与BufferedOutputStream可以为InputStream类的物件增加缓冲区功能,使用它们,您无需自行设计缓冲区。BufferedInputStream的资料成员buf是个位元阵列,预设为2048位元组大小,当读取资料来源时,例如档案, BufferedInputStream会尽量将buf填满,当使用read()方法时,实际上是先读取buf中的资料,而不是直接对资料来源作读取,当buf中的资料不足时,BufferedInputStream才会再从资料来源中提取资料。BufferedOutputStream的资料成员buf是个位元阵列,预设为512个位元组,当写入资料时,会先将资料存至buf中,当buf已满时才会一次将资料写至目的地,而不是每次写入都对目的地作写入。将上一个主题的范例作个改写,这次不用自行设定缓冲区并进行判断了,使用BufferedInputStream、 BufferedOutputStream让程式看来简单一些,也比较有效率:- BufferedStreamDemo.java