Java--IO流知識詳解

IO

1IO(掌握)

 IO流:把數據看做水流一樣的,從某個地方流向某個地方
 (1)IO流的作用:上傳文件和下載文件。(本質:讀取數據和寫出數據)
   上傳文件:
    數據源:本地
    目的地:服務器
   下載文件:
    數據源:服務器
    目的地:本地
  (2)IO流的分類:
   A:流向
     輸入流 讀取數據
      輸出流 寫出數據
   B:數據類型
     字節流
      字節輸入流
     字節輸出流
     字符流
      字符輸入流
       字符輸出流

  一般來說,如果沒有說明按照哪種類型分,指的是按照數據類型分。
  (3)什麼時候使用字符流,什麼時候使用字節流。
   如果一個要操作的文件,通過記事本打開並能夠讀懂其內容,就可以考慮使用字符流。
  否則,就使用字節流。
  什麼都不知道,就用字節流。

  分析問題的步驟: 
   分析:
    A:數據類型?
     字符流
    B:讀取還是寫出?
     輸出流
    A,B可以知道我們要使用的流對象是:Writer

 (4)IO的基類及具體類
   IO
    |--字節流
      字節輸入流
       InputStream
       FileInputStream
      字節輸出流
      OutputStream
      FileOutputStream
    |--字符流
          字符輸入流
                 Reader
                     FileReader
          字符輸出流
                 Writer
                    FileWriter
 (5)FileWriter寫數據的步驟及代碼體現:
  步驟:
    A:創建字符輸出流對象。
    B:調用write方法。
    C:釋放資源。

  代碼體現:
    FileWriter fw= new FileWriter("fw.txt");

   fw.write("hello,io");

   fw.close();

  幾個要注意的小問題:
    A:創建字符輸出流對象做了幾件事情?
     A:調用系統功能,創建一個文件fw2.txt
     B:創建字符輸出流對象。
     C:把對象指向文件。
    B:字符輸出流爲什要flush()?
     因爲我們使用的是字符流,而數據底層是字節流的數據。
     所以,我們不能直接把字符流數據寫到文本文件。
     這個時候,數據存在,但是沒有直接進文件,在內存中的緩衝區裏面。
     我們需要把緩衝區給刷新一下。
    C:爲什麼要close()?
     A:關閉流對象,流對象就是垃圾了。
     B:通知操作系統去釋放和開始創建的那個文件相關的資源。 
    D:flush()close()的區別?
     A:flush()刷新緩衝區,流對象還可以繼續使用。
     B:close()釋放資源,但是會先刷新一次緩衝區,保證數據不丟失,操作完畢後,流對象不可以再被使用。 
    E:如何實現數據的換行?
     不同的操作系統對換行符的識別不太一致:
      windows:\r\n
      linux:\n
      mac:\r
    F:如何實現追加寫入數據?
     使用帶兩個參數的構造方法。第二個參數指示是否是追加寫入。  
     publicFileWriter(String fileName,boolean append)

    FileWriterfw = new FileWriter("fw4.txt",true);
     //寫數據
     for(int x = 0; x < 10; x++) {
      fw.write("java"+ x);
      //加入換行符
      fw.write("\r\n");
     }
  (6)FileReader讀數據的步驟及代碼體現:
   步驟:
    A:創建字符輸入流對象。
    B:調用read方法,並把數據顯示在控制檯。
    C:釋放資源。

  代碼體現:
    FileReader fr= new FileReader("fr.txt");

   //方式1:一次讀取一個字符
    int ch =0;
    while((ch=fr.read())!=-1){
     System.out.print((char)ch);
    }

   //方式2:一次讀取一個字符數組
    char[] chs =new char[1024];
    int len =0;
    while((len=fr.read(chs))!=-1){
     System.out.print(String.valueOf(chs,0,len));
    }

   fr.close();
  (7)複製文本文件:
   兩種方式操作。代碼自己補齊。

  數據源:c:\\a.txt
   目的地:d:\\b.txt
  (8)加入異常後的代碼(看懂即可)
   A:FileWriter寫數據
   B:字符流複製文本文件


2:字節流(掌握)

 (1)繼承體系
   InputStream
    FileInputStream
   OutputStream
    FileOutputStream
  (2)案例:
   A:字節流複製文本文件。
   B:字節流複製圖片。
   C:字節流複製MP4並測試效率。

3:高效流(掌握)
 (1)字符高效流
  BufferedReader
   BufferedWriter

  案例:
    高效流複製文本文件。
 (2)字節高效流
   BufferedInputStream
   BufferedOutputStream

  案例:
    高效流複製圖片。
 (3)字符高效流的特殊功能
   BufferedReader
    StringreadLine()
   BufferedWriter
    voidnewLine()

  案例:
    高效流特殊功能複製文本文件。
  (4)IO流的使用
   文本文件的複製:9種。
    字節流:4
    字符流:5

  二進制流數據的複製:4種。
    音視頻文件。

4:轉換流(理解)
 (1)鍵盤錄入寫到文本文件。
   Scanner實現。
  (2)System.in錄入數據,寫到文本文件。
   BufferedReader br = newBufferedReader(new InputStreamReader(System.in));

  理解:從字節到字符
   使用:從字節到字符
  (3)把文本文件的數據,用System.out寫到控制檯
  BufferedWriter bw = newBufferedWriter(new OutputStreamWriter(System.out));

  理解:從字符到字節
   使用:從字節到字符
 (4)案例:
  數據源  目的地
   a.txt  b.txt
   a.txt  System.out
   System.in b.txt
   System.in System.out
  (5)案例:
   System.in -- a.txt -- b.txt --System.out
  (6)案例:
   A:ArrayList -- a.txt
   B:a.txt -- ArrayList

5:字符編碼(理解)
 (1)編碼表:由字符及其對應的數值組成的一張表。
  (2)常見的編碼表:
   ASCII
   ISO-8859-1
    gb2312
   gbk
    gb18030
   big5
   utf-8
  (3)編碼問題:
  A:IO流中的編碼問題
  B:String類中的編碼問題

  記住:統一編碼最好。

6Properties(理解)
  (1)是鍵值對形式的屬性列表。是Map體系的一個集合類。
    可以和IO流進行結合使用。
  (2)案例:
   A:作爲Map集合的使用。
   B:作爲集合的特有功能使用
    a:setProperty(Stringkey,String value)
    b:getProperty(Stringkey)
     stringPropertyNames()
   C:IO流結合使用的例子
    a:load()把文件中的數據加載到集合中
    b:store()把集合中的數據存儲到文件中
   D:給你一個文件,user.txt。請判斷裏面是否有鍵爲"lisi"的,如果有,則修改其值爲100

7:打印流(掌握)
 (1)打印流僅僅是用來寫數據的,沒有讀取數據的。
  (2)打印字節流 PrintStream
   System:
    public staticfinal PrintStream out

   System.out.println();

   打印字符流 PrintWriter
 (3)特點:
   A:可以把任意類型的數據寫到文本文件。
   B:如果啓動了自動刷新,在調用println()的方法的時候,可以自動刷新,並換行。
   C:可以直接對文件進行操作。
    問題:哪些流可以直接對象文件進行操作。
    API,流的構造方法,如果可以同時有FileString類型的參數,就可以。
  (4)案例:
   通過打印流改進複製文本文件的代碼

  BufferedReaderbr = new BufferedReader(new FileReader("a.txt"));
   PrintWriter pw = newPrintWriter(new FileWriter("b.txt"),true);

  String line =null;
   while((line=br.readLine()) !=null) {
    pw.println(line);
   }

  pw.close();
   br.close();

8:序列化和反序列化流(理解)
   (1)序列化:把對象按照流一樣的方式存儲到文件中或者在網絡中傳輸。
     簡記:把對象按照流一樣操作。
            反序列化:把文件中或者網絡中的流數據還原成對象。
     簡記:流數據還原對象。
  (2)對象怎麼才能實現序列化呢?
   讓對象所屬的類實現序列化接口。
  (3)記住:
   看到一個類實現了序列化接口,就要知道,該類的對象可以被序列化流進行操作。
    將來還可以通過反序列化流還原。
   如果想在序列化後,對java文件做一些簡單的改動,不影響以前寫過的數據,
   那麼,就應該在java文件中給出固定的序列化id值。
   而且,這樣做了以後,還可以解決黃色警告線問題。

9:其他的幾個瞭解的流對象(理解)
 (1)DataOutputStream/DataInputStream
      可以把基本數據類型的數據寫到文件,也可以還原爲基本的數據類型的數據。
         只不過,要注意還原時候的順序和寫的順序要一致。
 (2)ByteArrayOutputStream,ByteArrayInputStream
   (3)CharArrayWriter,CharArrayReader

 

發佈了29 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章