1. 程式人生 > >java中IO流的知識點總結

java中IO流的知識點總結

1.流的概念

流是一組有順序的,有起點和終點的位元組集合,是對資料傳輸的總稱或抽象。即資料在兩裝置間的傳輸稱為流,流的本質是資料傳輸,根據資料傳輸特性將流抽象為各種類,方便更直觀的進行資料操作。

2.IO流的分類

IO流分為字元流和位元組流.
字元流

位元組流

3.位元組流和字元流的區別

1.位元組流讀取的時候,讀到一個位元組就返回一個位元組; 字元流使用了位元組流讀到一個或多個位元組(中文對應的位元組數是兩個,在UTF-8碼錶中是3個位元組)時。先去查指定的編碼表,將查到的字元返回。
2.位元組流可以處理所有型別資料,如:圖片,MP3,AVI視訊檔案,而字元流只能處理字元資料。只要是處理純文字資料,就要優先考慮使用字元流,除此之外都用位元組流。

4.通過程式碼體現IO流中各種流的方法的使用

1.用普通位元組流複製a檔案的內容到b檔案中

public class CopyFileDemo {
public static void main(String[] args) throws IOException {
    FileInputStream fis=new FileInputStream("a.txt");
    FileOutputStream fos=new FileOutputStream("b.txt");

    //方式一:一次讀取寫入單個位元組
    int i=0;
    while((i=fis.read())!=-1){
        fos.write(i);
    }
    fos.close();
    fis.close();

    //方式二:一次讀取寫入一個位元組陣列
    byte[] by=new byte[1024];
    int len=0;
    while((len=fis.read(by))!=-1){
        fos.write(by,0,len);
    }
    fos.close();
    fis.close();
}
}

2.使用高效字元流複製檔案

public class CopyFileDemo3 {
public static void main(String[] args) throws IOException {
    BufferedReader br=new BufferedReader(new FileReader("a.txt"));
    //如果d檔案中有資料,true表示繼續往檔案中追加資料
    BufferedWriter bw=new BufferedWriter(new FileWriter("d.txt",true));

    String line=null;
    //高效字元輸入流的特有方法readline(),每次讀取一行資料
    while((line=br.readLine())!=null){
        bw.write(line);
        //高效字元輸出流的特有方法newline()
        bw.newLine();
        //將緩衝區中的資料刷到目的地檔案中
        bw.flush();
    }
    //關閉流,其實關閉的就是java呼叫的系統底層資源。在關閉前,會先重新整理該流。
    bw.close();
    br.close();
}
}
注:
a.高效流不能直接對檔案進行操作,必須通過普通流操作.高效流是從輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取。 可以指定緩衝區的大小,或者可使用預設的大小。大多數情況下,預設值就足夠大了
b.位元組流在操作的時候本身是不會用到緩衝區(記憶體)的,是與檔案本身直接操作的,而字元流在操作的時候是使用到緩衝區的,並且可以使用flush方法強制進行重新整理緩衝區

5.轉換流

InputStreamReader 是位元組流通向字元流的橋樑
OutputStreamWriter 是字元流通向位元組流的橋樑
轉換流可以將位元組轉成字元,原因在於,將獲取到的位元組通過查編碼表獲取到指定對應字元。
轉換流的最強功能就是基於 位元組流 + 編碼表 。沒有轉換,沒有字元流

6.列印流

PrintWriter
PrintStream
注:
A:只操作目的地,不操作資料來源
B:可以操作任意型別的資料
C:如果啟用了自動重新整理,在呼叫println(),printf(),format()方法的時候,能夠換行並重新整理
D:可以直接操作檔案

7.序列化流

ObjectOutputStream序列化流
ObjectInputStream反序列化流
序列化:把物件作為一個整體按照流一樣的方式傳輸或者儲存。
反序列化:把網路中的流資料或者檔案中的流資料還原成物件
主要方法有:
1.Object readObject();該方法丟擲異常:ClassNotFountException。
2. void writeObject(Object):被寫入的物件必須實現一個介面:Serializable,否則就會丟擲:NotSerializableException
3.如果實現了該介面,想解決黃線問題就生成一個隨機的serialVersionUID號碼

8.綜合小案例:鍵盤錄入資料儲存到檔案中

public class InputStreamReaderDemo {
public static void main(String[] args) throws IOException {
    //建立鍵盤錄入
    InputStream is=System.in;
    //將位元組流轉換為字元流
    InputStreamReader isr=new InputStreamReader(is);
    //高效字元流讀取資料
    BufferedReader br=new BufferedReader(isr);
    //列印流寫入資料,第一個true表示如果檔案中有內容就追加資料,第二個true表示啟用自動重新整理
    PrintWriter pw=new PrintWriter(new FileWriter("a.txt",true),true);

    String line=null;
    while((line=br.readLine())!=null){
        if("over".equals(line)){
            break;
        }
        //PrintWriter啟用自動重新整理
        pw.println(line);
    }
    pw.close();
    br.close();
}
}