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()); } } }