NO IMAGE

所有的程式都離不開資訊的輸入和輸出。例如,從鍵盤讀取的資料,在網路上交換資料,列印報表,讀寫檔案資訊等,都要涉及資料輸出的處理。在面嚮物件語言中,輸入和輸出都是通過資料流來實現的。在java中,處理資料流的類的主要被放在java.Io包中

資料流的基本概念

1, 
資料來源(Data,Sourt),是指那些能夠提供資料的地方,包括鍵盤,磁碟檔案,網路介面等。

2, 
資料宿(Data Sink):指能夠接收資料的地方,可以使磁碟檔案,網路介面以及顯示器,印表機等外部裝置。(資料宿夜可以認為是資料傳輸的目的地)

資料流
考慮到資料來源的多樣性,為了更有效地進行資料的輸入、輸出操作,Java中把不同的資料來源與程式之間的資料傳輸都抽象表述為“流”(stream),實現相對統一和簡單的輸入/輸出操作方式。傳輸中的資料就像流水一樣,也稱為資料流。

資料流的分類方式

按照資料流動的方向,可分為輸入流(Input Stream)和輸出流(Output Stream)

輸入流只能從中讀取資料,而不能向其寫出資料;

輸出流則只能向其寫出資料,而不能從中讀取資料

這裡站在程式的角度來確定出入方向,即將資料從程式外部傳送到程式中謂之“輸入”資料,將程式中的資料傳送到外部謂之“輸出”資料。

根據資料流所關聯的是資料來源還是其他資料流,可分為節點流(Node Stream)和處理流(Processing Stream)

節點流可以從/向一個特定的地方讀/寫資料。

例,FileReader fr=new FileReader(“demo.txt”);

處理流是對一個已存在的流的連線和封裝,通過所封裝的流的功能呼叫實現增強的資料讀/寫功能,處理流並不直接連線到資料來源。

例,BufferedReader br=new BufferedReader(new FileReader(“demo.txt”));

按傳輸資料的“顆粒大小”劃分,可分為字元流(Character Stream)和位元組流(Byte Stream)

位元組流以位元組為單位進行資料傳輸,每次傳送一個或多個位元組;

字元流以字元為單位進行資料傳輸,每次傳送一個或多個字元;(字元流使用了位元組流讀到一個或多個位元組(中文對應的位元組數是兩個,在UTF-8碼錶中是3個位元組)時,先去查指定的編碼表,將查到的字元返回)

位元組流可以處理所有型別的資料,如圖片、mp3、avi

字元流只能處理字元資料。

結論:只要是處理純文字資料,就要優先考慮使用字元流,除此之外都用位元組流

注意:Java採用的命名慣例有助於我們區分位元組流型別和字元流型別:凡是以InputStream或OutputStream結尾的型別均為位元組流,凡是以Reader或Writer結尾的均為字元流。(IO體系中的子類名字尾都是父類名稱,而字首都是體現子類功能的名字)

字元流

   Reader類和Writer類用來專門處理字元流。這兩個類都是抽象類,從他們派生出了許多子類,增強功能、提高效率,實現各種不同要求的字元輸入/輸出流的處理。

Reader

抽象類java.io.Reader是所有字元輸入流型別的父類,其中宣告瞭用於讀取字元流的有關方法,其類層次關係為:

Writer類中定義的主要方法

public void write(int c):將一個字元寫入到流中。

public void write(char[]):將陣列中的字元依次寫出。

public abstract void write(char[] bcbuf,intoff,int len):將陣列中下標off開始的len個字元寫出。

public void write(String):將一個字串寫入到流中。

public abstract void flush():重新整理流,將流中的資料重新整理到目的地中,流還存在。

public abstreact void close():關閉資源,關閉前會先呼叫flush,重新整理流中的資料去目的地,然後流關閉。

FileWriter的使用

該類沒有特有的方法。只有自己的建構函式。

該類特點:

用於處理文字檔案。

該類中有預設的編碼表,

該類中有臨時緩衝。

建構函式

public FileWriter(String filename);//呼叫系統資源,在指定位置,建立一個檔案。注意:如果該檔案已存在,將會被覆蓋。

public FileWriter(String filename,booleanappend);//當傳入的boolean型別的引數值為true時,會在指定檔案末尾處進行資料的續寫。

例項1,將文字資料儲存到一個檔案中。

class Demo{

         publicstatic void main(String[] args)throws IOException{

                   FileWriterfw = new FileWriter(“demo.txt”);

                   fw.write(“abcdec”);

                   fw.flush();

                   fw.write(“kkkk”);

                   fw.close();

         }

}

例項2,完整的異常處理方式。

class Demo{

                   publicstatic void main(String[] args)throws IOException{

                            FileWriterfw = null;

                            try{

                                     fw= new FileWriter(“z:\\demo.txt”);

                                     fw.write(“abcdec”);

                                     fw.flush();

                                     fw.write(“kkkk”);

                   }catch(IOExceptione){

                            System.out.println(e.toString());

                   }finally{

                            if(fw!=null)

                                     try{

                                               fw.close();        

                                     }catch(IOExceptione){

                                               System.out.println(“close:” e.toString());

                                     }       

                   }       

         }

}

當指定絕對路徑時,定義目錄分隔符有兩種方式:

反斜線但是一定要寫兩個。\\  new FileWriter(“c:\\demo.txt”);

斜線  /  寫一個即可。        new FileWriter(“c:/demo.txt”);

FileReader的使用

用於讀取文字檔案的流物件。

建構函式:在讀取流物件初始化的時候,必須要指定一個被讀取的檔案。
public FileReader(String filename);//如果該檔案不存在會發生FileNotFoundException

注意:read方法若返回-1,則表明當前讀取位置已經到達流的末尾。例如:int ch;

while((ch=fr.read())!=-1){

      //資料處理(char)ch

}