Java I\O輸入輸出流

---------------------- android培訓java培訓、期待與您交流! ----------------------

I/O

 

Java I/O最關鍵的4個類是InputStream(輸入字節流)、OutputStream(輸出字節流)、Reader(輸入字符流)、Writer(輸出字符流),它們都是public abstract class類。

InputSream和OutputStream對於數據的傳送是以字節Byte爲單位的,而Reader和Writer對於數據的傳送是以字符Character爲單位的。所以我們看到java.io包中的類大體上可以分爲兩大類,一類是以Byte處理爲主的Stream類,它們都是以XXXStream方式命名的;一類是以Character處理爲主的Reader/Writer類,它們都是以XXXReader或XXXWriter的方式命名的。

字節輸入流:

         1.FileInputStream

                   可以用來讀取文件中的數據.

         使用構造函數FileInputStream(String)來創建對象, 如果文件不存在會拋出異常

         使用int read()方法可以讀取一個字節, 返回int值代表字節數據

         使用int read(byte[])方法可以一次讀取若干字節, 返回int值代表讀到了多少個字節

         使用void close()方法關閉流, 釋放資源

     2.FileOutputStream

         可以用來寫出數據到文件.

         使用構造函數FileOutputStream(String)來創建對象, 文件不存在就創建, 文件存在則清空,

如果需要追加數據, 可以使用構造函數FileOutputStream(String,boolean), boolean參數傳true就是追加數據.

         使用void write(int b)方法可以寫出1個字節

使用void write(byte[] b, int off, int len)可以寫出字節數組中的數據, 從第一個int位置開始寫, 第二個int是寫出多少個

         使用void close()方法關閉流, 釋放資源

        

三.拷貝文件

         1.使用FileInputStream和FileOutputStream, 逐個字節拷貝, 效率很低.

         2.使用FileInputStream和FileOutputStream, 定義數組進行拷貝, 效率高.

         3.使用BufferedInputStream和BufferedOutputStream, 調用內置緩衝機制, 逐個字節拷貝.

 

 

3.數組操作流

內存虛擬文件或者內存映像文件就是把內存中的一塊數據存儲緩衝區,虛擬成一個文件,原來該寫入硬盤文件上的內容可以被寫入到這個內存中,原來該從硬盤文件中讀取的內容也可以在內存中讀取。
而要在內存中定義一個大的內存緩衝區,這個內存緩衝區通常就是一個字節數組,在java中專門定義了這兩個類用於以IO流的方式來完成對字節數組的讀寫來支持類似虛擬文件或者內存映像文件的類似功能

 

ByteArrayInputStream:把內存中的一個緩衝區作爲InputStream使用  (讀入到內存)

ByteArrayInputStream有兩個構造函數,每個構造函數都需要一個字節數組來作爲數據源:

(1)ByteArrayInputStream(byte[] buf)
(2)ByteArrayInputStream(byte[]buf, int offset, int len); 指定僅使用數組buf中的從offset開始的len個元素作爲數據源.

 

    

 

ByteArrayOutputStream:把信息存入內存中的一個緩衝區中

ByteArrayOutputStream可以把字節數據寫到內存中, 用內存作爲緩衝區, 可以從內存中一次性獲取寫出的數據.

ByteArrayOutputStream也有兩個構造函數;

1ByteArrayOutputStream()
2ByteArrayOutputStream(intlen);

第一種形式的構造函數創建一個32字節的緩衝區,第二個形式則是根據參數指定的大小創建緩衝區,緩衝區的大小在數據過多時能夠自動增長。

這兩個構造函數創建的緩衝區在數據過多的時候都會自動增長
創建緩衝區以後,我們的程序就可以把它像虛擬文件一樣寫入數據,當寫完數據,就可以調用ByteArrayOutputStream的一個方法(byte[] toByteArray())把這其中的內容當做一個字節數組來返回

用這兩個類可以提高運行效率,不用訪問硬盤直接在內存中讀寫。

 

2.怎麼使用

         創建對象:     ByteArrayOutputStream()

         寫出一個字節: voidwrite(int b)

         寫出數組:     voidwrite(byte[] b, int off, int len)

         獲取數據:     byte[]toByteArray()

    

 

 

流的來源或目的地不一定是文件,也可以是內存中的一個空間,例如一個位數組。java.io.ByteArrayInputStreamjava.io.ByteArrayOutputStream即是將位數組當作流輸入來源、輸出目的地的類。

 

3.應用場景

         讀取文件中的字符數據, 可以先用字節流讀取數據, 寫入到內存. 獲取所有數據, 一次性轉爲字符.

          拷貝文件, 可以先用字節流讀取數據, 寫入到內存.獲取所有數據, 一次性寫出.   

打印流:

         PrintStream:

                   特點:

                   1,構造函數可接收File對象,字符串路徑,字節輸出流。意味着打印目的可以有很多。

                   2,該對象具備特有的方法打印方法print,println,可以打印任何類型的數據。

                   3,特有的print方法可以保持任意類型的數據表現形式的原樣性,將數據輸出到目的地。

                            而對於OutputStream父類中的write方法,是將數據的最低字節寫出去。

 

         PrintWriter:

                   特點:

                   1,當操作的數據是字符時,可以選擇PrintWriter,比PrintStream要方便。

                   2,它的構造函數可以接收File對象,字符串路徑,字節輸出流,字符輸出流。

                   3,構造函數中,如果參數是輸出流,那麼可以通過指定另一個參數true完成自動刷新,該trueprintln方法有效。

                  

         什麼時候用?

         當需要保證數據表現的原樣性時,就可以使用打印流的打印方法來完成,這樣更爲方便。

     保證數據表現形式的原樣性的原理:其實就是將數據變成字符串,再進行寫入操作。

 

PrintStream 爲其他輸出流添加了功能,使它們能夠方便地打印各種數據值表示形式。它還提供其他兩項功能。與其他輸出流不同,PrintStream永遠不會拋出 IOException;而是,異常情況僅設置可通過 checkError 方法測試的內部標誌。另外,爲了自動刷新,可以創建一個PrintStream;這意味着可在寫入 byte 數組之後自動調用 flush 方法,可調用其中一個 println 方法,或寫入一個換行符或字節 ('\n')。

PrintStream 打印的所有字符都使用平臺的默認字符編碼轉換爲字節。在需要寫入字符而不是寫入字節的情況下,應該使用PrintWriter類。

 

 

PrintWriter向文本輸出流打印對象的格式化表示形式。此類實現在 PrintStream 中的所有 print 方法。它不包含用於寫入原始字節的方法,對於這些字節,程序應該使用未編碼的字節流進行寫入。

PrintStream 類不同,如果啓用了自動刷新,則只有在調用 println、printf或 format 的其中一個方法時纔可能完成此操作,而不是每當正好輸出換行符時才完成。這些方法使用平臺自有的行分隔符概念,而不是換行符。

此類中的方法不會拋出 I/O 異常,儘管其某些構造方法可能拋出異常。客戶端可能會查詢調用checkError() 是否出現錯誤。

數據操作流:

     1.什麼是數據操作流

         DataOutputStream可以按照基本數據類型大小寫出數據

         DataInputStream可以按照基本數據類型大小讀取數據

     2.怎麼使用

         創建輸出流:        DataOutputStream(OutputStreamout)

         創建輸入流:        DataInputStream(InputStreamin)

         寫出int:          voidwriteInt(int v)

         寫出long:         voidwriteLong(long v)

         讀取int:          intreadInt()

         讀取long:         longreadLong()

序列流:

     1.什麼是序列流

         SequenceInputStream可以將多個InputStream合併成一個

         讀取的時候, 從第一個開始讀, 第一個流讀到末尾自動讀取第二個, 直到最後一個流讀到末尾返回-1

     2.怎麼使用

         合併兩個輸入流:    SequenceInputStream(InputStreams1, InputStream s2)

         合併多個輸入流:    SequenceInputStream(Enumeration<?extends InputStream> e)

對象操作流:

     1.什麼是對象操作流

         ObjectOutputStream可以把一個對象寫出

         ObjectInputStream可以讀取一個對象

     2.怎麼使用

ObjectInputStream與ObjectOutputStream類所讀寫的對象必須實現了Seralizable接口。對象中的transient和static類型的成員變量不會被讀取和寫入。

         創建對象輸出流:    ObjectOutputStream(OutputStreamout)

         創建對象輸入流:    ObjectInputStream(InputStreamin)

         寫出對象:     voidwriteObject(Object obj

         讀取對象:     ObjectreadObject()

     3.讀寫多個對象

         由於readObject方法無法判斷流末尾, 所以通常在寫出多個對象的時候, 可以將多個對象裝入一個集合, 一次性寫出.

         讀取的時候讀取到集合, 然後迭代集合得到每一個對象.

 

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