JAVA BIO 回顧

應用程序難免會有輸入和輸出,輸入輸出的對象包括內存、文件、網絡等,Java.io包就是用於進行這個工作的,但是這個包也並沒有處理所有的輸入輸出類型,比如GUI或網頁上的輸出。

1.關於輸入和輸出流
我們通常將OutputStream稱爲輸出流,表示我們可以向其中寫入數據;把InputStream稱爲輸入流,可以從其中讀取數據;輸出流需要和一個可以寫入數據的目標媒介相關聯,輸入流需要和一個能夠讀取數據的數據源相關聯。常見的有:文件、管道、內存、網絡連接、System.in、System.out、System.err等。上面提到了流的概念,從概念上來說,流可以認爲是一個連續的數據,你既可以從流中讀取數據也可以向其中寫入數據。在Java IO根據讀寫單位的不同可以分爲字節流、字符流。也就是說我們總是通過InputStream和Reader流從數據源來讀取數據,通過OutputStream和Writer來向目標媒介寫入數據。最後一個問題就是Java IO爲什麼會包含那麼多不同的類,這是因爲Java 爲不同的媒介(數據源)分別提供了不同的類,包括文件訪問、網絡訪問、內存緩存訪問、線程內部通信(管道)、緩衝、過濾、解析、讀寫文本 (Readers / Writers)、讀寫基本類型數據 (long, int etc.)、讀寫對象

2.文件讀寫
讀文件:二進制文件可以使用FileInputStream來讀取,可以一次讀取一個字節(此時返回這個字符的ascii碼)或將讀取的內容裝到傳入的一個字符數組中去。文本文件文件可以使用FileReader讀取,可以一次讀取一個字符(返回的還是編碼對應的數字)或將讀取的內容寫入到傳入的字符數組中去。
寫文件:如果要寫入的是二進制數據,可以使用FileOutputStream,可以一次寫入一個字節或寫入一個字節數組;如果寫入的是文本數據,則使用FileWriter,可以一次寫入一個字符或寫入一個字符數組。
數據會按照寫入的順序存儲在文件中。
隨機存儲:RandomAccessFile可以實現對文件的隨機存儲,這裏的隨機指的是可以從指定的位置進行讀寫操作,而並不是說讀寫的位置是隨機的。通過這個類,我們可以覆蓋文件的一部分、讀取文件中間的一部分、在文件的末尾追加一些數據。
文件和目錄信息的獲取:可以通過File類來獲取文件或目錄的一些信息,比如文件的類型、大小,目錄下的文件列表。這裏需要注意File對象並不實際代表一個文件或目錄,它只代表一個包含相關信息的邏輯對象,所以我們不能通過File對象來對文件進行讀寫操作。

3.管道
Java IO中的管道爲運行在同一個JVM中的兩個線程提供了通信能力,所以管道也可以作爲數據源和目標媒介進行操作。unix/Linux中的管道可以爲運行與不同地址空間的進程進行通信,而Java中只能用於同進程下的線程通信。管道一般只能傳遞字節/字符數據,如果需要在線程間傳遞完整對象的話,可以選擇其它通信方式。具體的來說 ,可以通過PipeInputStream和PipeOutputSteam、PipeReader和PipeWriter來創建管道。一個PipedInputStream流應該和一個PipedOutputStream流相關聯。一個線程通過PipedOutputStream寫入的數據可以被另一個線程通過相關聯的PipedInputStream讀取出來;這種關聯關係可以在創建的時候指定,也可以通過他們的connect方法進行管理,PipedInputStream和PipedOupputStream都有一個connect方法。注意,使用兩個相關聯的管道流時,務必將他們分配給不同的線程。因爲read()和write()方法調用時會阻塞,則意味着如果在一個線程中同時進行讀寫,可能會造成線程死鎖。

4.網絡
對網絡進行數據操作和文件沒有什麼不一樣,當使用Java API建立了網絡連接以後,再獲取其InputStream和OutPutStream就可以進行數據的讀寫了。本質上操作的還是InputStream和OutputStream。

關於各個具體類之間的具體作用可以參考之前的博客:http://blog.csdn.net/acm_lkl/article/details/46775867

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