1. 简介
过滤器流就是串联在流上,执行一些额外操作的东西。其中很重要,很常用的就是缓冲流BufferedInputStream与BufferedOutputStream。
缓冲流的作用简单而直接而有效,每次读写不是只有几个字节就开始从磁盘等数据源读写,而是先放到内存的缓冲区(其实就是类似于byte[]类型的内存变量中),等缓冲区满了(具体缓冲区多大可以自己定义)再一次性读写数据源。
因为内存读写速度远远快于磁盘等其他介质读写速度,所以缓存的存在是有意义的。
2. BufferedInputStream示例
工具类,保存定义的常量及方法(暂时只有常量)
//工具类
package com.maoge.stream;
import java.io.File;
public class StreamUtils {
//用于定义每次读取的长度
public static final int BUFFER_LENGTH=512;
//文件对象
public static File FILE_FOR_READ;
public static File FILE_FOR_WRITE;
static{
FILE_FOR_READ=new File("C:\\test.txt");
FILE_FOR_WRITE=new File("C:\\result.txt");
}
}
读取示例,一定要注意文件编码
//使用缓冲流读入
public static void bufferedRead(){
InputStream in=null;
try {
in = new FileInputStream(StreamUtils.FILE_FOR_READ);
//使用缓冲流串联,因为BufferedInputStream也是InputStream子类
in=new BufferedInputStream(in);
//保存读出的内容
StringBuilder sb=new StringBuilder();
//定义缓冲区
byte[] buffer=new byte[StreamUtils.BUFFER_LENGTH];
//实际读到的字符长度
int bytesRead=0;
while((bytesRead=in.read(buffer))!=-1){
//注意编码,文本文件要另存为UTF-8格式,然后此处也写明按UTF-8读取。
sb.append(new String(buffer,0,bytesRead,"UTF-8"));
}
System.out.println(sb.toString());
} catch (Exception ex) {
System.out.println(ex.toString());
}finally{
try {
in.close();
} catch (IOException ioEx) {
System.out.println(ioEx.toString());
}
}
}
3. BufferedOutputStream示例
注意.flush()是强制将缓冲区内容输出到流,因为有时候缓冲区挺大,而且还没满,是不会自动输出到流的,所以有时候就会得不到程序员员设想的结果,所以为了保险,在确保得到结果时先.flush()
public static void bufferedWrite(){
OutputStream out=null;
try {
out = new FileOutputStream(StreamUtils.FILE_FOR_WRITE);
out=new BufferedOutputStream(out);
String content="这就是要写入的内容,我要吟诗一首:今天我是真高兴!";
out.write(content.getBytes(), 0, content.getBytes().length);
//刷新!
out.flush();
} catch (Exception ex) {
System.out.println(ex.toString());
}finally{
try {
out.close();
} catch (IOException ioEx) {
System.out.println(ioEx.toString());
}
}
}