java iwap框架,Java的I/O框架導讀

Java的I/O框架是提供系統輸入和輸出功能,主要是涉及文件,網絡數據流,內存緩沖等的輸入輸出,網頁端的輸入和輸出主要依靠J2EE的Servlet和HTTP,GUI的輸入輸出依靠Swing工程中的JFC (Java Foundation Classes) 類。

81ea60c94f6856ba1c50fc2d9c1da32b.png

Java I/O框架的主要關注的是從數據源讀取數據寫入到目標媒介:

ca7d9aa6d9c04a67b2c203d4f1b24474.png

當讀取或寫入數據時,Java設計了兩種不同的方式,字節流和字符流, InputStream和OutputStream是字節的輸入和輸出,Reader和Writer是字符的輸入和輸出。

Java I/O框架的主要應用場景:

文件訪問

網絡訪問

內存緩存訪問

線程內部通信(管道)

緩沖

過濾

解析

讀寫文本 (Readers / Writers)

讀寫基本類型數據 (long, int etc.)

讀寫對象

通過Java IO讀文件

FileInputStream或者FileReader從文件開始到文件末尾一次讀取一個字節或者字符,或者將讀取到的字節寫入到字節數組或者字符數組。你不必一次性讀取整個文件,相反你可以按順序地讀取文件中的字節和字符。

需要跳躍式地讀取文件其中的某些部分,可以使用RandomAccessFile。

通過Java IO寫文件

根據你要寫入的數據是二進制型數據還是字符型數據選用FileOutputStream或者FileWriter。你可以一次寫入一個字節或者字符到文件中,也可以直接寫入一個字節數組或者字符數據。數據按照寫入的順序存儲在文件當中。

通過Java IO隨機存取文件

可以通過RandomAccessFile對文件進行隨機存取,隨機存取並不意味着你可以在真正隨機的位置進行讀寫操作,它只是意味着你可以跳過文件中某些部分進行操作,並且支持同時讀寫,不要求特定的存取順序。這使得RandomAccessFile可以覆蓋一個文件的某些部分、或者追加內容到它的末尾、或者刪除它的某些內容,當然它也可以從文件的任何位置開始讀取文件。

文件和目錄信息的獲取

讀取文件或者目錄信息時可以使用File類。

以字節為單位的輸入流的框架圖

06ba9d79f607aa99144d93a3e0927679.png

(01) InputStream 是以字節為單位的輸入流的超類。InputStream提供了read()接口從輸入流中讀取字節數據。

(02) ByteArrayInputStream 是字節數組輸入流。它包含一個內部緩沖區,該緩沖區包含從流中讀取的字節;通俗點說,它的內部緩沖區就是一個字節數組,而ByteArrayInputStream本質就是通過緩沖字節數組來實現的。

(03) PipedInputStream 是管道輸入流,它和PipedOutputStream一起使用,PipedInputStream 綁定到PipedOutputStream或者通過connect()連接,能實現多線程間的管道通信。

(04) FilterInputStream 是過濾輸入流。它是DataInputStream和BufferedInputStream的超類。

(05) DataInputStream 是數據輸入流。它是用來裝飾其它輸入流,它“允許應用程序以與機器無關方式從底層輸入流中讀取基本 Java 數據類型”。

(06) BufferedInputStream 是緩沖輸入流。它的作用是為另一個輸入流添加緩沖功能。

(07) File 是“文件”和“目錄路徑名”的抽象表示形式。關於File,注意兩點:

a), File不僅僅只是表示文件,它也可以表示目錄!

b), File雖然在io包中定義,但是它的超類是Object,而不是InputStream。

(08) FileDescriptor 是“文件描述符”。它可以被用來表示開放文件、開放套接字等。

(09) FileInputStream 是文件輸入流。它通常用於對文件進行讀取操作。

(10) ObjectInputStream 是對象輸入流。它和ObjectOutputStream一起,用來提供對“基本數據或對象”的持久存儲。

以字節為單位的輸出流的框架圖

f64c4a1fecd6710ecea2fe7bcdacfea6.png

(01) OutputStream 是以字節為單位的輸出流的超類。OutputStream提供了write()接口從輸出流中讀取字節數據。

(02) ByteArrayOutputStream 是字節數組輸出流。寫入ByteArrayOutputStream的數據被寫入一個 byte 數組。緩沖區會隨着數據的不斷寫入而自動增長。可使用 toByteArray() 和 toString() 獲取數據。

(03) PipedOutputStream 是管道輸出流,它和PipedInputStream一起使用,能實現多線程間的管道通信。

(04) FilterOutputStream 是過濾輸出流。它是DataOutputStream,BufferedOutputStream和PrintStream的超類。

(05) DataOutputStream 是數據輸出流。它是用來裝飾其它輸出流,它“允許應用程序以與機器無關方式向底層寫入基本 Java 數據類型”。

(06) BufferedOutputStream 是緩沖輸出流。它的作用是為另一個輸出流添加緩沖功能。

(07) PrintStream 是打印輸出流。它是用來裝飾其它輸出流,能為其他輸出流添加了功能,使它們能夠方便地打印各種數據值表示形式。

(08) FileOutputStream 是文件輸出流。它通常用於向文件進行寫入操作。

(09) ObjectOutputStream 是對象輸出流。它和ObjectInputStream一起,用來提供對“基本數據或對象”的持久存儲。

以字節為單位的輸入流和輸出流關聯的框架圖

輸入流和輸出流都有對應的關系,下面是將以字節為單位的輸入流和輸出流關聯起來的圖片。

1145996c71a23f15070395969b3dab93.png

以字符為單位的輸入流的框架圖

e21195cef1a09a3ecca8d2497ff4a7e5.png

中文使用字節流讀取會出現亂碼,一個中文有兩個字節,所以這種情況下要使用字符流。

(01) Reader 是以字符為單位的輸入流的超類。它提供了read()接口來取字符數據。

(02) CharArrayReader 是字符數組輸入流。它用於讀取字符數組,它繼承於Reader。操作的數據是以字符為單位!

(03) PipedReader 是字符類型的管道輸入流。它和PipedWriter一起是可以通過管道進行線程間的通訊。在使用管道通信時,必須將PipedWriter和PipedReader配套使用。

(04) FilterReader 是字符類型的過濾輸入流。

(05) BufferedReader 是字符緩沖輸入流。它的作用是為另一個輸入流添加緩沖功能。

(06) InputStreamReader 是字節轉字符的輸入流。它是字節流通向字符流的橋梁:它使用指定的 charset 讀取字節並將其解碼為字符。

(07) FileReader 是字符類型的文件輸入流。它通常用於對文件進行讀取操作。

以字符為單位的輸出流的框架圖

下面,是以字符為單位的輸出流的框架圖。

c8c54a7a35faf5be4760b7ebca9e24de.png

(01) Writer 是以字符為單位的輸出流的超類。它提供了write()接口往其中寫入數據。

(02) CharArrayWriter 是字符數組輸出流。它用於讀取字符數組,它繼承於Writer。操作的數據是以字符為單位!

(03) PipedWriter 是字符類型的管道輸出流。它和PipedReader一起是可以通過管道進行線程間的通訊。在使用管道通信時,必須將PipedWriter和PipedWriter配套使用。

(04) FilterWriter 是字符類型的過濾輸出流。

(05) BufferedWriter 是字符緩沖輸出流。它的作用是為另一個輸出流添加緩沖功能。

(06) OutputStreamWriter 是字節轉字符的輸出流。它是字節流通向字符流的橋梁:它使用指定的 charset 將字節轉換為字符並寫入。

(07) FileWriter 是字符類型的文件輸出流。它通常用於對文件進行讀取操作。

(08) PrintWriter 是字符類型的打印輸出流。它是用來裝飾其它輸出流,能為其他輸出流添加了功能,使它們能夠方便地打印各種數據值表示形式。

以字符為單位的輸入流和輸出流關聯的框架圖

下面是將以字符為單位的輸入流和輸出流關聯起來的圖片。

c1c84e471a41725802350482f0d57e4e.png

字節轉換為字符流的框架圖

在java中,字節流能轉換為字符流,下面是它們的轉換關系圖。

ac35cb5932633796471074f1b7afd6e2.png

從中,我們可以看出。

(01) FileReader繼承於InputStreamReader,而InputStreamReader依賴於InputStream。具體表現在InputStreamReader的構造函數是以InputStream為參數。我們傳入InputStream,在InputStreamReader內部通過轉碼,將字節轉換成字符。

(02) FileWriter繼承於OutputStreamWriter,而OutputStreamWriter依賴於OutputStream。具體表現在OutputStreamWriter的構造函數是以OutputStream為參數。我們傳入OutputStream,在OutputStreamWriter內部通過轉碼,將字節轉換成字符。

字節和字符的輸入流對應關系

5fde8479dd9b69f2815fc644c476a26a.png

字節和字符的輸出流對應關系

ec42440d8f68c5fa439bd0b6367e104d.png

Java I/O系列目錄:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值