java.io (1) 基本輸入輸出流

一堆廢話(趕快跳過)

在咱們的平常開發中 I/O 涉及到咱們開發的方方面面,雖然早在 JDK1.5 就新增了 NIO的概念,可是 java.io 的使用以及技巧在咱們的平常開發中仍是佔據很高的比重。java

概念(不看也行)

最基本的I/O 流是 java.io 包中的抽象類 java.io.InputStreamjava.io.OutputStream。s有預留的設計比較早,所以並無採用如今流行的面向接口的編程思路,而是採用了抽象類。新增的I\O相關的API則大量使用了接口。若是留的實現只是對使用者暴漏字節這個層次的細節,則能夠直接集成InputStream 或 OutputStream 類,而且提供本身二外的能力。編程

在接下來的幾個章節中,會逐章記錄
如下各類流類的詳細使用方法數組

  1. BufferedInputStream, BufferedOutputStream 緩衝複用流
  2. ByteArrayInputStream, ByteArrayOutputStream byte數組緩衝流
  3. DataInputStream, DataOutputStream java原生數據流
  4. ObjectInputStream, ObjectOutputStream 對象序列化流
  5. PushbackInputStream, PushbackOutputStream 推回流
  6. PipedInputStream, PipedOutputStream 管道流
  7. SequenceInputStream, SequenceOutputStream 序列流

和字符流類和字符流的的裝飾類性能

  1. Reader, Writer
  2. InputStreamReader, InputStreamWriter
  3. StringReader, StringWriter
  4. BufferedReader, BufferedWriter
  5. CharArrayReader, CharArrayWriter

同時也會記錄一些 java8 融入 Google guava 類庫對 流類的支持。設計

基本輸入流

輸入流 InputStream類中包含兩類功能code

輸入流的兩大功能

  1. 讀取流中字節數據的功能是經過 read 方法來完成。該方法有如下3種重載形式

    • public abstract int read() throws IOException
    • public int read(byte b[]) throws IOException
    • public int read(byte b[], int off, int len) throws IOException

比較常見的操做流的方式就是 建立一個字節數組做爲緩衝區,而後循環讀取,直到read方法返回-1或拋出 java.io.IOException 異常。read方法的返回值是每次調用中成功讀取的字節數。 須要要注意的是在讀取的過程當中,對read方法調用是阻塞的。當流中沒有數據可用時,對read方法的調用須要等待。這種阻塞式的特性可能會成爲應用中的性能瓶頸。對象

若是不使用字節數組,那麼read方法每次只能讀取到一個字節,再有緩衝區的狀況下雖然InputStream類每次也只是讀取一個字節,可是 InputStream類的子類通常會接受一個緩衝區最爲參數的read方法提供更高效的實現。接口

抽象

正像他的名字同樣,字節流是流動的,像流水同樣。劉中的字節一旦流過去,就沒法從新使用。ip

  1. 控制流的功能。開發

    • close 關閉功能
      經過 close 方法,咱們能夠關閉一個 流,就像擰上水管龍頭同樣。java7及之後,更推薦使用 try-with-resource 語句來使用流。能夠避免顯示的調用close方法。
    javatry (
        FileInputStream fInput = new FileInputStream(new File("path/to/exists_file"));
        FileOutputStream fOutput = new FileOutputStream(new File("path/to/new_file"));
    ) {
        // ....fInput -> read -> fOutput
    } catch (IOException e) {
        .....
    } catch (FileNotFoundException e) {
        .....
    }
    • skip 跳過若干個字節。至關於保留當前的位置日後移動若干個字節,這個功能能夠經過skip方法來實現並非全部的InputStream累都支持skip方法。

    • mark 讀取位置標記

    • reset 讀取位置重置
      標記和重置是配合使用的,能夠實現能夠實現流中的內容重複讀取,而不會像通常的讀取那樣操做,數據流過去以後就沒法在次讀取。可是並非全部的流都支持標記功能,所以在使用mark方法來標記當前位置以前,須要經過markSupporetd方法來判斷當前流的實現是否支持標記功能。
    • available 獲取當沒有阻塞狀況下,當前流中還有多少字節可供讀取。若是咱們每次讀取調用available方法獲取到的字節書,不如在讀取一個大文件的同時對文件的內容進行處理,若是每次讀取是都不發生阻塞,就能夠比較好的平均數據讀取和處理的時間。

基本輸出流

與InputStream類相對應的OutputStream類表示基本的輸出流,用來把數據從程序輸出到其餘地方。基本OutputStream類的對象也是在本身這個層次上操做。其中最主要的是寫入數據的write方法。

  1. write 寫入方法。
    public abstract void write(int b) throws IOException
    public void write(byte b[]) throws IOException
    public void write(byte b[], int off, int len) throws IOException

    write 方法也有3種相似的重載形式,能夠每次寫入一個字節,也能夠寫入一個字節數組中所有或部份內容。

  2. 控制方法

    • close 方法
      關閉當前輸出流
    • flush 方法 強制要求OutputStream類對象對暫時保持內部緩衝區中的內容當即進行實際的寫入操做。由於有些OutputStream類的子類會在內部維護一個緩衝區,經過write方法寫入的數據會被首先放在這個緩衝區中,而後再摸個適合的實際執行已經緩衝的內容的寫入操做。在通常的場景中OutputStream對象的使用者通常不須要直接調用flush方法保證內部緩衝區數據成功寫入。這是由於當OutputStream類對象內部的緩衝區滿了之後,會自動執行寫入操做。OutputStram類的對象被關閉時,flush方法通常也會被自動調用。
相關文章
相關標籤/搜索