1. 程式人生 > >JAVA處理流BufferedReader、BufferedWriter

JAVA處理流BufferedReader、BufferedWriter

處理流就是包在其它流上面的流(有時包在節點流之外, 節點流就是直接和資料來源連線的流),處理流不是直接和資料來源連線,而是從資料來源讀取到資料以後再通過處理流處理一遍。
緩衝流也包含了四個類:BufferedInputStream、BufferedOutputStream、BufferedReader和BufferedWriter。

package cn.com.jlu.test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import
java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; import java.io.Writer; public
class BufferReaderWriterDemo { /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { bufferedWriterReaderDemo(); } public static void bufferedInputOutputDemo() throws IOException{ long start=System.currentTimeMillis(); InputStream fin=new
FileInputStream(new File("E:\\zhangsan\\song.mp3")); OutputStream fio=new FileOutputStream(new File("E:\\aaa.mp3")); BufferedInputStream bis=new BufferedInputStream(fin); BufferedOutputStream bio=new BufferedOutputStream(fio); int len=-1; byte[] b=new byte[1024*1024]; while((len=bis.read(b))!=-1) { bio.write(b, 0, len); } fin.close(); fio.close(); long end=System.currentTimeMillis(); System.out.println("總共耗時:"+(end-start)+"毫秒"); } /** * 通過節點流FileWriter,外面包著處理流BufferedWriter來將內容寫入到檔案當中,並 * 通過節點流FileReader,外面包著處理流BufferedReader來從檔案中讀取內容。 * 將緩衝區當作橋樑 * @throws IOException */ public static void bufferedWriterReaderDemo() throws IOException { Writer w=new FileWriter(new File("E:\\zhangsan\\la.txt")); //往裡面寫入內容 BufferedWriter biw=new BufferedWriter(w); biw.write("I have a pen,I have a pencil"); //寫入一個行分隔符。 biw.newLine(); biw.write("apple and pineapple"); //重新整理該流的緩衝,將緩衝區的資料立刻寫出來 biw.flush(); Reader r=new FileReader("E:\\zhangsan\\la.txt"); //FileReader一次只讀取一個位元組,BufferedReader將讀取的內容放到記憶體的緩衝區裡面,等緩衝區滿了在讀取 BufferedReader bir=new BufferedReader(r); String str=""; while((str=bir.readLine())!=null) { System.out.println(str); } biw.close(); bir.close(); } }

位元組流與字元流的區別
位元組流和字元流使用是非常相似的,那麼除了操作程式碼的不同之外,還有哪些不同呢?
位元組流在操作的時候本身是不會用到緩衝區(記憶體)的,是與檔案本身直接操作的,而字元流在操作的時候是使用到緩衝區的
位元組流在操作檔案時,即使不關閉資源(close方法),檔案也能輸出,但是如果字元流不使用close方法的話,則不會輸出任何內容,說明字元流用的是緩衝區,並且可以使用flush方法強制進行重新整理緩衝區,這時才能在不close的情況下輸出內容

那開發中究竟用位元組流好還是用字元流好呢?
在所有的硬碟上儲存檔案或進行傳輸的時候都是以位元組的方法進行的,包括圖片也是按位元組完成,而字元是隻有在記憶體中才會形成的,所以使用位元組的操作是最多的。

如果要java程式實現一個拷貝功能,應該選用位元組流進行操作(可能拷貝的是圖片),並且採用邊讀邊寫的方式(節省記憶體)。