1、过滤流介绍
(1)过滤流(Filtered Stream)仅仅是为底层透明地提供扩展功能的输入流(输出流)的包装。这些流一般由普通类的方法(即过滤流的一个父类)访问。
(2)过滤字节流FilterInputStream和FilterOutputStream,它们不是抽象类,它们提供的方法和InputStream和OutputStream类的方法相同。构造方法有:
FilterOutputStream(OutputStream os);
FilterInputstream(InputStream is);
常用的过滤流有BufferedInputStream和BufferedOutputStream(带缓冲区),需要使用已经存在的节点流(直接操作设备的流)来构造,FileInputStream就是节点流,而BufferedInputStream包装了FileInputStream。提供带缓冲的读写,提高了读写的效率。DataInputStream和DataOutputStream(对基本数据类型进行读写操作)。数据输入输出流允许应用程序读写基本Java数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取。读写顺序要保持一致。
2、过滤流举例说明
(1)BufferedInputStream和BufferedOutputStream
package com.iotek.inputoutputstream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class BufferedInputOutputStreamDemo {
public static void main(String[] args) {
try {//这里不管是读取文件,还是写入文件,都应该是文件,而不是文件夹。
FileUtil.copyFile(new File("G:\\bookmarks_5_8_18.html"), new File("F:\\test\\test.html"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
class FileUtil{
public static void copyFile(File src,File dst) throws IOException{
FileInputStream fileInputStream = new FileInputStream(src);
FileOutputStream fileOutputStream = new FileOutputStream(dst);
BufferedInputStream bis = new BufferedInputStream(fileInputStream);
BufferedOutputStream bos = new BufferedOutputStream(fileOutputStream);
long time1 = System.currentTimeMillis();
int data = 0;
while((data = bis.read())!=-1){//从缓冲区里面读,而不是直接从输入流里面读。
bos.write(data);//先写到缓冲区,当缓冲区满的时候再一次性写到输出流里面去。
}
bis.close();
bos.close();
long time2 = System.currentTimeMillis();
System.out.println("复制完成,一共花费:" + (time2-time1) + "毫秒");
}
}
(2)DataInputStream和DataOutputStream
package com.iotek.inputoutputstream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataInputOutputStream {
public static void main(String[] args) throws IOException {
/*String name = "zhangsan";
int age = 10;
boolean flag = true;
char set = '男';
double money = 100.56;
DataOutputStream dos = new DataOutputStream(new FileOutputStream("f:\\test\\b.txt"));
dos.writeUTF(name);
dos.writeInt(age);
dos.writeBoolean(flag);
dos.writeChar(set);
dos.writeDouble(money);
dos.close();*/
DataInputStream dis = new DataInputStream(new FileInputStream("f:\\test\\b.txt"));
//读的顺序必须和写的顺序一致
System.out.println(dis.readUTF());
System.out.println(dis.readInt());
System.out.println(dis.readBoolean());
System.out.println(dis.readChar());
System.out.println(dis.readDouble());
dis.close();
}
}