1. 程式人生 > >IO流~(純乾貨!!!)

IO流~(純乾貨!!!)

一、流的定義(流的目的:永久性的儲存資料物件)

流就是I/O流,I就是input,O就是output。流其實是一個相對抽象的概念,就好像是一個傳輸資料的通道。Java中對檔案的操作就是以流的方式進行的,流是一組位元組的集合,表示有連線源和目的地的有方向的資料通道。

Java將資料從源(檔案、記憶體、鍵盤、網路)讀到了記憶體中,形成了流,然後將這些流還可以寫到另外的目的地(檔案、記憶體、控制檯、網路),之所以稱之為流,是因為這個資料序列在不同時刻所操作的是源的不同部分。

二、流的分類

1、按照流的傳輸方向

輸入流:讀取資料,從資料來源到當前程式(資料來源:磁碟、滑鼠、鍵盤、網路......)--->基類:InputStream、Reader

輸出流:寫資料,從當前程式到目的源(目的源:磁碟、網路通訊、顯示器......)--->基類:OutputStream、Writer

2、按照流的處理單元

位元組流:機器可以識別的,二進位制檔案流--->基類:InputStream、OutputStream

字元流:人可識別的字元--->Reader、Writer

3、按照流的角色

節點流:直接和資料來源相連線

處理流:一個已存在的流進行連線和封裝,通過封裝後的流來實現資料的讀、寫功能

三、詳細介紹各類

1、File類是IO包中唯一代表磁碟檔案本身的物件,通過File來建立、刪除、重新命名檔案,File類物件的主要作用就是用來獲取文字本身的一些資訊。

                                    File(String pathname):根據一個路徑得到一個File物件
A:構造方法:         File(String parent,String Child):根據一個目錄和一個子檔案/目錄得到File物件
                                    File(File parent,String Child):根據一個父File物件和一個子檔案/目錄得到File物件

2、輸入流

3、輸出流

4、隨機訪問 RandomAccessFile

RandomAccessFile是用來支援讀寫隨機存取檔案的類。隨機存取檔案的行為就像存取在檔案系統裡一個很大的位元組陣列一樣。該物件只能操作檔案,所以建構函式接收兩種型別的引數:a.字串檔案路徑;b.File物件。該物件既可以對檔案進行讀操作,也能進行寫操作,在進行物件例項化時可指定操作模式(r,rw)注意:該物件在例項化時,如果要操作的檔案不存在,會自動建立;
如果檔案存在,寫資料未指定位置,會從頭開始寫,即覆蓋原有的內容。可以用於多執行緒下載或多個執行緒同時寫資料到檔案。

特有方法:getFilePointer():返回檔案記錄指標的當前位置

             seek(long pos):將檔案記錄指標定位到pos的位置

四、程式碼演示

步驟1:開啟讀/寫字元/位元組流

步驟2:讀/寫操作

步驟3:關閉流

try {
      //建立寫字元流  會有異常考慮
      FileWriter fileWriter=new FileWriter(path);
      //每次寫入一個字元
      fileWriter.write(97);
      //通過char陣列,寫入資料
      char[] chars=new char[]{'a','b','c'};
      fileWriter.write(chars);
      //通過char陣列寫入資料,第一個引數:需要寫入讀取的資料來源,
      //第二個引數:在資料來源中讀取資料的起始位置,第三個引數:從起始位置讀取資料的長度
      fileWriter.write(chars,0,3);
      //寫入字串
      fileWriter.write("hello");
      //寫入字串:從指定位置寫入指定長度資料
      fileWriter.write("hello1",0,5);
      //寫字元流關閉
      fileWriter.close();
      } catch (IOException e) {
         e.printStackTrace();
       }
     }

五、總結(直接Copy老師的結論了)

操作流需要明確4個問題

問題1:操作時進行讀還是寫(資料來源到當前程式、當前程式到資料目的)
源:讀資料  inputStream \reader
目的:寫資料   outputStream\ writer

問題2:明確操作的是位元組還是字元
源:
   位元組:InputStream
   字元:Reader
目的:
   位元組:OutputStream
   字元:Writer
(明確操作那個基類的流)

問題3:資料做在的具體裝置
源:
  磁碟資料:File
  記憶體資料:char、array
  鍵盤:System.in
  網路:socket
目的:
  磁碟資料:File
  記憶體資料:char、array
  螢幕:System.out
  網路:socket   
(明確具體實現類)

問題4:是否需要額外功能
考慮效率: BufferXXX
流轉換:inputStreamReader\outputStreamWriter