1. 程式人生 > >Java IO使用入門

Java IO使用入門

文檔 劃分 會有 轉換 內存 writer cimage 執行 應用場景

總體結構

IO應該是平時項目裏最常用到的功能了,無論是簡單的文件讀取,還是服務器端口監聽,都會用到IO;但是,在面對Java IO包裏龐雜的IO基礎類庫時,經常會很頭大,是該選擇InputStream還是應該選擇Reader,應該為InputStream增加一個Buffer嗎?如何根據應用場景選擇合適的類庫是擺在很多代碼人員面前的一個難題,這裏我將Java IO包裏的常用類庫做了一個梳理,包括它們的組織結構,功能特性,適用場景等,以方便後續使用時能方便快捷的根據需求選取最合適的IO類

技術分享

根據解析圖,從大的層面可以IO進行兩個維度的劃分:

  1. 數據類型,即:字符 or 字節,類上對應於Writer/Reader
    or OutputStream/InputStream
  2. 操作類型,即:讀取(輸入) or 寫入(輸出),類上對應於Reader/InputStream or Writer/OutputStream

使用技巧

Java IO的所有操作都無外乎這兩種維度四大主類的擴展,大部分比較簡單,下面對於稍微難理解以及值得註意的點進行單獨說明

  1. Java IO大量使用了Decorator模式,所以,一般在使用IO類庫的時候都是采用Decorator的調用方式:
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
  1. 在Java IO中,無論是字符的讀與寫還是字節的讀與寫,基本都是一一對應的,換句話說,有一個特定讀的類,一般就會有一個特定寫的類,把握這一點,可以起到化繁為簡的作用,如FileInputStreamFileOutputStream就分別對應於文件的讀和寫;PipedInputStreamPipedOutputStream分別對應於管道數據的讀和寫
  2. 如何區分讀 or 寫,這是一個經常會困擾新手的問題,這裏我提供一個簡單的區分方式:以你當前運行的程序作為基準(即調用IO的程序),數據從程序傳至其它地方則為寫(輸出),數據從其它地方傳至程序則為讀(輸入);如將程序產生的數據存放至日誌文件中,那麽就是寫,從端口中取得數據並在程序中進行處理,則是讀
技術分享
  1. 根據要執行的動作以及目標數據類型,同時結合使用場景選擇合適的IO類進行組裝,註意上面一句話其實涉及到三個步驟:
    • 執行的動作,即是要讀還是要寫
    • 數據類型,即是字節還是字符,有的時候還需要字符與字節的轉換(如OutputStreamWriter);如需要在網絡上或內存裏存儲的數據,一般都是以字節的形式;又或者文件的寫入,文本類的文件這種本身就是字符編碼的一般是字符形式,而對於圖片,視頻等文件則只能使用字節的形式
    • 使用場景,其實使用場景需要分兩步考慮,首先考慮顯而易見的場景,如是文件的操作還是字符串的操作,抑或是管道通信;其次需要考慮性能,如對文件的寫操作是否會比較頻繁,若是,則建議通過BufferedWriter對其進行封裝,因為每次都對少量數據進行文件打開並寫入是一個效率很低的方式

總結

本文主要對基本的IO類做了簡單的梳理,並就IO中的基本概念以及如何使用IO基礎類庫做了說明,當然,本文並未羅列所有的IO實現類,感興趣的同學可以自己查看Java的文檔或源碼,同時本文也未如何自己定制IO類庫,其實一般情況下Java提供的基礎類庫足以滿足需求;另外Java在1.4後引入了NIO,即:No Blocking IO,它與原IO的使用場景有一定區別


Java學習交流QQ群:589809992 禁止閑聊,非喜勿進!

Java IO使用入門