1. 程式人生 > >JAVA—IO操作

JAVA—IO操作

一、JAVA I/O 輸入輸出流

  1:編碼問題

  2:File類的使用

  3:RandomAccessFile的使用

  4:位元組流的使用

  5:字元流的使用

  6:物件的序列化和反序列化

 

 

2: file類的使用。

  java.io.file類用於表示檔案(目錄)

  File類只用於表示檔案(目錄)的資訊(名稱,大小等),不能用於檔案內容的訪問。

 

3:RandomAccessFile的使用

  RandomAccessFile java 提供的對檔案內容的訪問,既可以讀檔案,也可以寫檔案。

  RandomAccessFile 支援隨機訪問檔案,可以訪問檔案的任意位置。

 

  (1)java 檔案模型

    在硬碟上的檔案是 byte byte byte 儲存的,是資料的集合。

  (2)開啟檔案

    有兩種模式,“rw” (讀寫)  “r”(只讀)

    RandomAccessFile raf=new RandomAccessFile(file,"rw");

    檔案指標,開啟檔案時指標在開頭 pointer=0;

  (3)寫方法。

    raf.write(int)---> 只寫一個位元組(後八位),同時指標指向下一個位置,準備再次寫入。

  (4)讀方法。

    int b = raf.read(); ---> 讀一個位元組

  (5)檔案讀寫完成以後一定要關閉(Oracle官方說明)。

 

 

 

4:位元組流的使用。

  IO流,(輸入流,輸出流)

  位元組流,字元流.

 

  1、位元組流。

    InputStream/OutputStream

    InputStream 抽象了應用程式讀取資料的方式。

    OutputStream 抽象了應用程式寫出資料的方式。

  2、EOF = End 讀到 -1 就讀到結尾。

  3、輸入流基本方法

    int b = in.read(); 讀取一個位元組無符號 填充到 int 低 八位 , -1是EOF。

    in.read(byte[] buf);  讀取資料填充到 位元組陣列 buf

    in.read(byte[] buf,int start,int size);

  4、輸出流基本方法。

    out.write(int b); 寫出一個byte 到 流,b的 低8位。

    out.write(byte[] buf) 將buf位元組陣列都寫入到流。

    out.write(byte[] buf , int start,int size)

 

  5、FileInputStream ---> 具體實現了在檔案上讀取資料

  6、FileOutputStream 實現了向檔案中寫出byte資料的方法。

 

  7、DataOutputStream/DataInputStream

    對“流”功能的擴充套件,可以更加方面的讀取 int,long, 字元等型別資料。

    DataOutputStream 

    writeInt()/writeDouble()/writeUTF()

 

  8、BufferedInputStream&BufferedOutputStream

    這兩個流類位 IO提供了帶緩衝區的操作,一般開啟檔案進行寫入,

    或讀取操作時,都會加上緩衝,這種流模式提高了IO的效能。

    從應用程式中把輸入放入檔案,相當於將一缸水倒入另一缸中。

    FileOutputStream--->write() 方法相當於一滴一滴的把水“轉移過去”

    DataOutputStream--->writeXxx() 方法會方便些,相當於一瓢一瓢把水“轉移”過去。

    BufferedOutputStream--->write方法更方便,相當於一瓢一瓢先放入桶中,再從桶中倒入到另一個桶中。

 

5、字元流。

  1、編碼問題。

  2、認識文字和文字檔案。

    java的文字(char)是16位無符號整數,是字元的unicode編碼(雙位元組編碼)

    檔案是byte byte byte...的資料序列。

    文字檔案是文字(char)序列按照某中編碼方案(utf-8,utf-16be,gbk)序列化為byte的儲存結果。

  3、字元流(Reader Writer)

    字元的處理,一次處理一個字元。

    字元的底層任然是基本的位元組序列。

    字元流的基本實現

    InputStreamReader 完成byte流解析為char流,按照編碼解析

    OutputStreamWriter 提供char流到byte流,按照編碼處理

 

    FileReader/FileWriter

 

  字元流過濾器

    BufferedReader ---> readLine 一次讀一行

    BufferedWriter ---> PrintWriter 寫一行

 

6、物件的序列化和反序列化

  1、物件序列化,就是將Object轉換成byte序列,反之叫物件的反序列化

  2、序列化流(ObjectOutputStream)是過濾流

        反序列化流(ObjectInputStream)---readObject

  3、 序列化介面(Serializable)

        物件必須是新序列化介面,才能進行序列化,否則將出現異常。

        這個介面,沒有任何方法,只是一個標準。

  4、transient關鍵字

      private void writeObject(java.io.ObjectOutputStream s)

        throws java.io.IOException

      private void readObject(java.io.ObjectInputStream s)

        throws java.io.IOException,ClassNotFoundException

 

    分析ArrayList原始碼

  5、序列化中子類和父類建構函式的呼叫問題

 

 

原始碼 地址 :https://github.com/Yahuiya/studyJava/tree/master/src/com/imooc/io