1. 程式人生 > >轉載自:http://blog.csdn.net/hguisu/article/details/7418161 作者為:真實的歸宿

轉載自:http://blog.csdn.net/hguisu/article/details/7418161 作者為:真實的歸宿

轉載自:http://blog.csdn.net/hguisu/article/details/7418161 作者為:真實的歸宿

1.什麼是IO

      Java中I/O操作主要是指使用Java進行輸入,輸出操作. Java所有的I/O機制都是基於資料流進行輸入輸出,這些資料流表示了字元或者位元組資料的流動序列Java的I/O流提供了讀寫資料的標準方法。任何Java中表示資料來源的物件都會提供以資料流的方式讀寫它的資料的方法。  

      Java.io是大多數面向資料流的輸入/輸出類的主要軟體包。

此外,Java也對塊傳輸提供支援,在核心庫 java.nio中採用的便是塊IO。

  流IO的好處是簡單易用,缺點是效率較低。塊IO效率很高,但程式設計比較複雜。 
      Java IO模型  :
      Java的IO模型設計非常優秀,它使用Decorator模式,按功能劃分Stream,您可以動態裝配這些Stream,以便獲得您需要的功能。例如,您需要一個具有緩衝的檔案輸入流,則應當組合使用FileInputStream和BufferedInputStream。 

2.資料流的基本概念

        資料流是一串連續不斷的資料的集合,就象水管裡的水流,在水管的一端一點一點地供水,而在水管的另一端看到的是一股連續不斷的水流。資料寫入程式可以是一段、一段地向資料流管道中寫入資料,這些資料段會按先後順序形成一個長的資料流。對資料讀取程式來說,看不到資料流在寫入時的分段情況,每次可以讀取其中的任意長度的資料,但只能先讀取前面的資料後,再讀取後面的資料。不管寫入時是將資料分多次寫入,還是作為一個整體一次寫入,讀取時的效果都是完全一樣的。 

      “流是磁碟或其它外圍裝置中儲存的資料的源點或終點。”

    在電腦上的資料有三種儲存方式,一種是外存,一種是記憶體,一種是快取。比如電腦上的硬碟,磁碟,U盤等都是外存,在電腦上有記憶體條,快取是在CPU裡面的。外存的儲存量最大,其次是記憶體,最後是快取,但是外存的資料的讀取最慢,其次是記憶體,快取最快。這裡總結從外存讀取資料到記憶體以及將資料從記憶體寫到外存中。對於記憶體和外存的理解,我們可以簡單的理解為容器,即外存是一個容器,記憶體又是另外一個容器。那又怎樣把放在外存這個容器內的資料讀取到記憶體這個容器以及怎麼把記憶體這個容器裡的資料存到外存中呢?

     在Java類庫中,IO部分的內容是很龐大的,因為它涉及的領域很廣泛:

         標準輸入輸出,檔案的操作,網路上的資料流,字串流,物件流,zip檔案流等等,java中將輸入輸出抽象稱為流,就好像水管,將兩個容器連線起來。將資料衝外存中讀取到記憶體中的稱為輸入流,將資料從記憶體寫入外存中的稱為輸出流。

    流是一個很形象的概念,當程式需要讀取資料的時候,就會開啟一個通向資料來源的流,這個資料來源可以是檔案,記憶體,或是網路連線。類似的,當程式需要寫入資料的時候,就會開啟一個通向目的地的流。

      總結的基本概念如下:

1) 資料流

    一組有序,有起點和終點的位元組的資料序列。包括輸入流和輸出流。

  

2) 輸入流(Input  Stream):

      程式從輸入流讀取資料來源。資料來源包括外界(鍵盤、檔案、網路…),即是將資料來源讀入到程式的通訊通道

     

 3) 輸出流

    程式向輸出流寫入資料。將程式中的資料輸出到外界(顯示器、印表機、檔案、網路…)的通訊通道。

         

採用資料流的目的就是使得輸出輸入獨立於裝置。

Input  Stream不關心資料來源來自何種裝置(鍵盤,檔案,網路)
Output  Stream不關心資料的目的是何種裝置(鍵盤,檔案,網路)

4 資料流分類:

流序列中的資料既可以是未經加工的原始二進位制資料,也可以是經一定編碼處理後符合某種格式規定的特定資料。因此Java中的流分為兩種:
 1)  位元組流:資料流中最小的資料單元是位元組
 2)  字元流:資料流中最小的資料單元是字元, Java中的字元是Unicode編碼,一個字元佔用兩個位元組。

3. 標準I/O

      Java程式可通過命令列引數與外界進行簡短的資訊交換,同時,也規定了與標準輸入、輸出裝置,如鍵盤、顯示器進行資訊交換的方式。而通過檔案可以與外界進行任意資料形式的資訊交換。

1. 命令列引數

[java]  view plain  copy    
  1. public class TestArgs {  
  2.     public static void main(String[] args) {  
  3.         for (int i = 0; i < args.length; i++) {  
  4.             System.out.println("args[" + i + "] is <" + args[i] + ">");  
  5.         }  
  6.     }  
  7. }  

執行命令:java Java C VB

執行結果:

args[0] is <Java>

args[1] is <C>

args[2] is <VB>

2. 標準輸入,輸出資料流

java系統自帶的標準資料流:java.lang.System:

[java]  view plain  copy    
  1. java.lang.System   
  2. public final class System  extends Object{   
  3.    static  PrintStream  err;//標準錯誤流(輸出)  
  4.    static  InputStream  in;//標準輸入(鍵盤輸入流)  
  5.    static  PrintStream  out;//標準輸出流(顯示器輸出流)  
  6. }  

注意:
(1)System類不能建立物件,只能直接使用它的三個靜態成員。
(2)每當main方法被執行時,就自動生成上述三個物件。

1) 標準輸出流 System.out

   System.out向標準輸出裝置輸出資料,其資料型別為PrintStream。方法:

      Void print( 引數)       Void println( 引數)

2)標準輸入流 System.in

    System.in讀取標準輸入裝置資料(從標準輸入獲取資料,一般是鍵盤),其數 據型別為InputStream。方法:

        int read()   //返回ASCII碼。若,返回值=-1,說明沒有讀取到任何位元組讀取工作結束。          int read(byte[] b)// 讀入多個位元組到緩衝區b中返回值是讀入的位元組數 例如: [java]  view plain  copy    
  1. import java.io.*;  
  2. public class StandardInputOutput {  
  3.     public static void main(String args[]) {  
  4.         int b;  
  5.         try {  
  6.             System.out.println("please Input:");  
  7.             while ((b = System.in.read()) != -1) {  
  8.                 System.out.print((char) b);  
  9.             }  
  10.         } catch (IOException e) {  
  11.             System.out.println(e.toString());  
  12.         }  
  13.     }  
  14. }  
等待鍵盤輸入,鍵盤輸入什麼,就打印出什麼:

3)標準錯誤流

   System.err輸出標準錯誤,其資料型別為PrintStream。可查閱API獲得詳細說明。

    標準輸出通過System.out呼叫println方法輸出引數並換行,而print方法輸出引數但不換行。println或print方法都通 過過載實現了輸出基本資料型別的多個方法,包括輸出引數型別為boolean、char、int、long、float和double。同時,也過載實現 了輸出引數型別為char[]、String和Object的方法。其中,print(Object)和println(Object)方法在執行時將調 用引數Object的toString方法。

[java]  view plain  copy    
  1. import java.io.BufferedReader;  
  2. import java.io.IOException;  
  3. import java.io.InputStreamReader;  
  4.   
  5. public class StandardInputOutput {  
  6.     public static void main(String args[]) {  
  7.         String s;  
  8.         // 建立緩衝區閱讀器從鍵盤逐行讀入資料  
  9.         InputStreamReader ir = new InputStreamReader(System.in);  
  10.         BufferedReader in = new BufferedReader(ir);  
  11.         System.out.println("Unix系統: ctrl-d 或 ctrl-c 退出"  
  12.                 + "\nWindows系統: ctrl-z 退出");  
  13.         try {  
  14.             // 讀一行資料,並標準輸出至顯示器  
  15.             s = in.readLine();  
  16.             // readLine()方法執行時若發生I/O錯誤,將丟擲IOException異常  
  17.             while (s != null) {  
  18.                 System.out.println("Read: " + s);  
  19.                 s = in.readLine();  
  20.             }  
  21.             // 關閉緩衝閱讀器  
  22.             in.close();  
  23.         } catch (IOException e) { // Catch any IO exceptions.  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27. }  

4.java.IO層次體系結構

     在整個Java.io包中最重要的就是5個類和一個介面。5個類指的是File、OutputStream、InputStream、Writer、Reader;一個介面指的是Serializable.掌握了這些IO的核心操作那麼對於Java中的IO體系也就有了一個初步的認識了

      Java I/O主要包括如下幾個層次,包含三個部分:

   1.流式部分――IO的主體部分;

   2.非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;

   3.其他類--檔案讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地作業系統相關的檔案系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。

   主要的類如下:

     1. File(檔案特徵與管理):用於檔案或者目錄的描述資訊,例如生成新目錄,修改檔名,刪除檔案,判斷檔案所在路徑等。

     2. InputStream(二進位制格式操作):抽象類,基於位元組的輸入操作,是所有輸入流的父類。定義了所有輸入流都具有的共同特徵。

     3. OutputStream(二進位制格式操作):抽象類。基於位元組的輸出操作。是所有輸出流的父類。定義了所有輸出流都具有的共同特徵。