JAVA IO學習記錄

IO流的分類

·        根據處理數據類型的不同分爲:字符流和字節流

·        根據數據流向不同分爲:輸入流和輸出流

·        按數據來源(去向)分類:

         1、File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter 
         2、byte[]:ByteArrayInputStream, ByteArrayOutputStream 
         3、Char[]: CharArrayReader,CharArrayWriter 
         4、String:StringBufferInputStream, StringReader, StringWriter 

        5、網絡數據流:InputStream,OutputStream, Reader, Writer 

字符流和字節流

流序列中的數據既可以是未經加工的原始二進制數據,也可以是經一定編碼處理後符合某種格式規定的特定數據。因此Java中的流分爲兩種:


 1)  字節流:數據流中最小的數據單元是字節
 2)  字符流:數據流中最小的數據單元是字符, Java中的字符是Unicode編碼,一個字符佔用兩個字節。

 

字符流的由來: Java中字符是採用Unicode標準,一個字符是16位,即一個字符使用兩個字節來表示。爲此,JAVA中引入了處理字符的流。因爲數據編碼的不同,而有了對字符進行高效操作的流對象。本質其實就是基於字節流讀取時,去查了指定的碼錶。

字節流和字符流的區別:(詳細可以參見http://blog.csdn.net/qq_25184739/article/details/51203733)    

 

         字節流沒有緩衝區,是直接輸出的,而字符流是輸出到緩衝區的。因此在輸出時,字節流不調用colse()方法時,信息已經輸出了,而字符流只有在調用close()方法關閉緩衝區時,信息才輸出。要想字符流在未關閉時輸出信息,則需要手動調用flush()方法。

 

·        讀寫單位不同:字節流以字節(8bit)爲單位,字符流以字符爲單位,根據碼錶映射字符,一次可能讀多個字節。

·        處理對象不同:字節流能處理所有類型的數據(如圖片、avi等),而字符流只能處理字符類型的數據。

 

結論:只要是處理純文本數據,就優先考慮使用字符流。除此之外都使用字節流。

字符流與字節流轉換

轉換流的特點:

1.    其是字符流和字節流之間的橋樑

2.    可對讀取到的字節數據經過指定編碼轉換成字符

3.    可對讀取到的字符數據經過指定編碼轉換成字節

 

何時使用轉換流?

1.    當字節和字符之間有轉換動作時;

2.    流操作的數據需要編碼或解碼時。

 

具體的對象體現:

轉換流:在IO中還存在一類是轉換流,將字節流轉換爲字符流,同時可以將字符流轉化爲字節流。

 

1.    InputStreamReader:字節到字符的橋樑

2.     OutputStreamWriter:字符到字節的橋樑

 

OutputStreamWriter(OutStreamout):將字節流以字符流輸出

InputStreamReader(InputStream in):將字節流以字符流輸入

 

這兩個流對象是字符體系中的成員,它們有轉換作用,本身又是字符流,所以在構造的時候需要傳入字節流對象進來。

1.輸入字節流InputStream

1.    InputStream是所有的輸入字節流的父類,它是一個抽象類。

2.    ByteArrayInputStream、StringBufferInputStream、FileInputStream是三種基本的介質流,它們分別從Byte數組、StringBuffer、和本地文件中讀取數據。

3.    PipedInputStream是從與其它線程共用的管道中讀取數據.

4.    ObjectInputStream和所有FilterInputStream的子類都是裝飾流(裝飾器模式的主角)。

InputStream中的三個基本的讀方法
      abstract int read() :讀取一個字節數據,並返回讀到的數據,如果返回-1,表示讀到了輸入流的末尾。
      int read(byte[] b) :將數據讀入一個字節數組,同時返回實際讀取的字節數。如果返回-1,表示讀到了輸入流的末尾。
      int read(byte[]?b, int off, int len) :將數據讀入一個字節數組,同時返回實際讀取的字節數。如果返回-1,表示讀到了輸入流的末尾。off指定在數組b中存放數據的起始偏移位置;len指定讀取的最大字節數。

流結束的判斷:方法read()的返回值爲-1時;readLine()的返回值爲null時。

2.輸出字節流OutputStream

1.    OutputStream是所有的輸出字節流的父類,它是一個抽象類。

2.    ByteArrayOutputStream、FileOutputStream是兩種基本的介質流,它們分別向Byte數組、和本地文件中寫入數據。PipedOutputStream是向與其它線程共用的管道中寫入數據。

3.    ObjectOutputStream和所有FilterOutputStream的子類都是裝飾流。

outputStream中的三個基本的寫方法
     abstract void write(int?b):往輸出流中寫入
一個字節
     void write(byte[]?b) :往輸出流中寫入數組b中的所有字節。
     void write(byte[]?b, int?off, int?len) :往輸出流中寫入數組b中從偏移量off開始的len個字節的數。

   void flush() :刷新輸出流,強制緩衝區中的輸出字節被寫出。
   void close() :關閉輸出流,釋放和這個流相關的系統資源。注:所有流都應該在結束時釋放。

3.字符輸入流Reader

1.    Reader是所有的輸入字符流的父類,它是一個抽象類。

2.    CharReader、StringReader是兩種基本的介質流,它們分別將Char數組、String中讀取數據。PipedReader是從與其它線程共用的管道中讀取數據。

3.    BufferedReader很明顯就是一個裝飾器,它和其子類負責裝飾其它Reader對象。

主要方法:

     (1) public int read() throws IOException; //讀取一個字符,返回值爲讀取的字符 

     (2) public int read(char cbuf[]) throws IOException; /*讀取一系列字符到數組cbuf[]中,返回值爲實際讀取的字符的數量*/ 
     (3) public abstract int read(char cbuf[],int off,int len) throws IOException; 
/*讀取len個字符,從數組cbuf[]的下標off處開始存放,返回值爲實際讀取的字符數量,該方法必須由子類實現*/ 

4.字符輸出流Writer

1.    Writer是所有的輸出字符流的父類,它是一個抽象類。

2.    CharArrayWriter、StringWriter是兩種基本的介質流,它們分別向Char數組、String中寫入數據。PipedWriter是向與其它線程共用的管道中寫入數據,

3.    BufferedWriter是一個裝飾器爲Writer提供緩衝功能。

主要方法:

(1)  public void write(int c) throws IOException; //將整型值c的低16位寫入輸出流 
(2)  public void write(char cbuf[]) throws IOException; //將字符數組cbuf[]寫入輸出流 
(3)  public abstract void write(char cbuf[],int off,int len) throws IOException; //將字符數組cbuf[]中的從索引爲off的位置處開始的len個字符寫入輸出流 
(4)  public void write(String str) throws IOException; //將字符串str中的字符寫入輸出流 
(5)  public void write(String str,int off,int len) throws IOException; //將字符串str 中從索引off開始處的len個字符寫入輸出流 

 


8.非流式文件類--File類

File類是Object的直接子類,同時它繼承了Comparable接口可以進行數組的排序。

File類共提供了三個不同的構造函數,以不同的參數形式靈活地接收文件和目錄名信息。

構造函數:
1)File (String   pathname)   
     例:File  f1=new File("FileTest1.txt"); //創建文件對象f1,f1所指的文件是在當前目錄下創建的FileTest1.txt
2)File (String  parent  ,  String child)
     例:File f2=new  File(“D:\\dir1","FileTest2.txt") ;//  注意:D:\\dir1目錄事先必須存在,否則異常
3)File (File    parent  , String child)
     例:File  f4=new File("\\dir3");
          File  f5=new File(f4,"FileTest5.txt");  //在如果 \\dir3目錄不存在使用f4.mkdir()先創建

        一個對應於某磁盤文件或目錄的File對象一經創建, 就可以通過調用它的方法來獲得文件或目錄的屬性。    
       1)public boolean exists( ) 判斷文件或目錄是否存在
       2)public boolean isFile( ) 判斷是文件還是目錄 
       3)public boolean isDirectory( ) 判斷是文件還是目錄
       4)public String getName( ) 返回文件名或目錄名
       5)public String getPath( ) 返回文件或目錄的路徑。
       6)public long length( ) 獲取文件的長度 
       7)public String[ ] list ( ) 將目錄中所有文件名保存在字符串數組中返回。 
       File類中還定義了一些對文件或目錄進行管理、操作的方法,常用的方法有:
       1) public boolean renameTo( File newFile );    重命名文件
       2) public void delete( );   刪除文件
       3)  public boolean mkdir( ); 創建目錄

9.RandomAccessFile類

  該對象並不是流體系中的一員,其封裝了字節流,同時還封裝了一個緩衝區(字符數組),通過內部的指針來操作字符數組中的數據。該對象特點:
   

1.    該對象只能操作文件,所以構造函數接收兩種類型的參數:a.字符串文件路徑;b.File對象。

2.    該對象既可以對文件進行讀操作,也能進行寫操作,在進行對象實例化時可指定操作模式(r,rw)

注意:該對象在實例化時,如果要操作的文件不存在,會自動創建;如果文件存在,寫數據未指定位置,會從頭開始寫,即覆蓋原有的內容。 可以用於多線程下載或多個線程同時寫數據到文件。


10、System類對IO的支持

Java語言系統預定了3個可以直接使用的流對象,分別是:
 System.in(標準輸入),通常代表鍵盤輸入。
 System.out(標準輸出):通常寫往顯示器。
 System.err(標準錯誤輸出):通常寫往顯示器。

注意:
(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中返回值是讀入的字節數

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方法。

附加:

 IOException異常類的子類
1.public class  EOFException :   非正常到達文件尾或輸入流尾時,拋出這種類型的異常。    

2.public class FileNotFoundException:   當文件找不到時,拋出的異常。

3.public class InterruptedIOException: 當I/O操作被中斷時,拋出這種類型的異常。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章