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