I/O流詳解

1 I/O流的分類


  • 按照流:

    • 輸入流


      輸出流
    • 輸出流
輸入流
  • 按照數據處理單位不同

  • 字節流
    一次讀入或者是讀取八位二進制,后綴為Stream

  • 字符流
    一次讀取或是讀取十六位二進制,后綴為Reader、Writer

  • 按照實現功能的不同

  • 節點流


    節點流

    當直接使用節點流時,讀寫不方便,為了提高效率,才有了處理流。

  • 處理流


    處理流

    處理流是和節點流一起使用,在節點流的基礎上套一層,套在節點流上的就是處理流。

2 常見的I/O流


先上圖:

幾個常見的I/O流

3 字節流


InputStreamOutputStream是兩個abstract類,對于字節為導向的 stream 都擴展這兩個基類;
3.1 InputStream抽象類

  • 常用的幾個方法

  • available():返回stream中的可讀字節數,inputstream類中的這個方法始終返回的是0,這個方法需要子類去實現。

  • close():關閉stream方法,這個是每次在用完流之后必須調用的方法。

  • read():方法是讀取一個byte字節,但是返回的是int。

  • read(byte[]):一次性讀取內容到緩沖字節數組

  • read(byte[],int,int):從數據流中的哪個位置offset開始讀長度為len的內容到緩沖字節數組

  • skip(long):從stream中跳過long類型參數個位置

  • mark(int):用于標記stream的作用

  • markSupported():返回的是boolean類型,因為不是所有的stream都可以調用mark方法的,這個方法就是用來判斷stream是否可以調用mark方法和 reset方法

  • reset():這個方法和mark方法一起使用的,讓stream回到mark的位置。


  • ByteArrayInputStream類:把內存中的一個緩沖區作為InputStream使用

    • 構造器:
      ByteArrayInputStream(byte[]):創建一個新字節數組輸入流,從指定的字節數組中讀取數據。(使用byte作為緩沖區數組)
      ByteArrayInputStream(byte[],int,int):創建一個新字節數組輸入流,從指定的字節數組指定范圍讀取數據。
  • StringBufferInputSteam類:把一個字符串作為InputStream

  • 構造器:
    StringBufferInputStream(String )
    不建議使用該類,因為該類不能將字符正確的轉換成字節。

  • FileInputStream類:將一個文件作為InputStream,對文件進行操作

  • 構造器:
    FileInputStream(File):創建一個文件流,從一個文件中進行讀取數據
    FileInputStream(FileDescriptor):創建一個文件流,從指定的文件描述中讀取數據
    FileInputStream(String):創建一個輸入文件流,從指定的文件名稱中讀取數據。

  • PipeInputStream類:實現了pipe的概念,在線程中使用,管道輸入流是只一個通訊管道的接收端。

  • 構造器:
    PipeInputStream():創建一個管道輸入流,它還未和一個管道輸出流連接。
    PipeInputStream(PipeOutStream):創建一個管道輸入流,已經和管道輸出流連接。

  • 方法:
    除了實現InputStream中的部分方法外,還有一個額外的方法
    connection(PipeOutStream):和一個管道輸出流連接

  • SequenceInputStream類:把多個InputStream流合并成一個InputStream(序列化流),序列化流允許把幾個單獨的輸入流合并到一起,并讓他們像單個輸入流一樣按順序輸入,當前一個輸入流完成后序列化流將自動關閉該流并切換到下一個輸入流。

  • 構造器:
    SequenceInputStream(Enumeration)創建一個新的序列化流,并使用一個輸入流的枚舉初始化它。
    SequenceInputStream(InputStream,InputStream,InputStream...)

  • FilterInputStream:一個過濾的InputStream
    兩個常用的子類

  1. BufferedInputStream:使用緩沖區的InputStream
  • 構造器:
    BufferedInputStream (InputStream):用InputStream作為參數初始化實例。
    BufferedInputStream (InputStream,int):設置緩沖區大小的實例。
  1. DataInputStream:數字格式化的stream
  • 構造器
    DataInputStream(InputStream):使用InputStream參數來初始化實例
  • 額外的方法:
    readInt,readFloat,readDouble...這樣可以直接從stream中讀取基本類型的數據

3.2 OutPutStream抽象類

  • 常用的幾個方法

  • write(int):寫入一個字節到stream中

  • write(byte[])寫入一個byte數組到stream中

  • write(byte[],int,int):把byte數組中從offset開始處寫入長度為len的數據

  • close():關閉流,這個是在操作完stream之后必須要調用的方法

  • flush():這個方法是用來刷新stream中的數據,讓緩沖區中的數據強制的輸出


  • ByteArrayOutputStream: 把信息存入內存中的一個緩沖區中 . 該類實現一個以字節數組形式寫入數據的輸出流,當數據寫入緩沖區時,它自動擴大。用 toByteArray() 和 toString() 能檢索數據。

  • 構造器
    ByteArrayOutputStream()創建一個新的字節數組輸出流。
    ByteArrayOutputStream(int)創建一個新的字節數組輸出流,并帶有指定大小字節的緩沖區容量。

  • 額外的方法:
    toByteArray()將字節流轉化成一個字節數組,用于數據的檢索
    toString()將字節流轉化成一個String對象,默認采用系統的編碼轉化,同樣可以用于數據的檢索
    toString(String) 根據指定字符編碼將緩沖區內容轉換為字符串,并將字節轉換為字符。
    writeTo(OutputStream)out.write(buf, 0, count)調用輸出流的寫方法將該字節數組輸出流的全部內容寫入指定的輸出流參數。

  • FileOutputStream: 文件輸出流是向 File 或 FileDescriptor 輸出數據的一個輸出流。

  • 構造器
    FileOutputStream(File name)創建一個文件輸出流,向指定的 File 對象輸出數據。
    FileOutputStream(FileDescriptor)創建一個文件輸出流,向指定的文件描述器輸出數據。
    FileOutputStream(String name)創建一個文件輸出流,向指定名稱的文件輸出數據。
    FileOutputStream(String, boolean) 用指定系統的文件名,創建一個輸出文件。

  • PipedOutputStream: 管道輸出流是指一個通訊管道的發送端。 一個線程通過管道輸出流發送數據,而另一個線程通過管道輸入流讀取數據,這樣可實現兩個線程間的通訊。

  • 構造器
    PipedOutputStream()創建一個管道輸出流,它還未與一個管道輸入流連接。
    PipedOutputStream(PipedInputStream)創建一個管道輸出流,它已連接到一個管道輸入流。

  • 額外的方法:
    connection(PipedInputStream):連接一個PipedInputStream方法

4 字符流


Unicode字符為導向的流,表示以Unicode字符為單位向Stream中存儲或者是從Stream中讀取。Reader/Writer為抽象類,其中方法和InputStream和OutputStraem中對應。

4.1 Reader

  • CharArrayReader :與 ByteArrayInputStream 對應此類實現一個可用作字符輸入流的字符緩沖區

  • 構造器
    CharArrayReader(char[]) 用指定字符數組創建一個 CharArrayReader 。
    CharArrayReader(char[], int, int) 用指定字符數組創建一個 CharArrayReader

  • StringReader: 與 StringBufferInputStream 對應其源為一個字符串的字符流。

  • FileReader **: 與 FileInputStream 對應

  • PipedReader **:與 PipedInputStream 對應

  • InputStreamReader**:將InputStream轉化成Reader

4.2 Writer

  • CharArrayWriter: 與 ByteArrayOutputStream對應

  • StringWriter:無與之對應的以字節為導向的stream

  • FileWriter: 與FileOutputStream 對應

  • PipedWriter:與 PipedOutputStream對應

  • OutputStreamWriter:將OutputStream轉化成Writer

  • PrintReader:和PrintStream對應

5 兩種不同流之間的轉換


  • InputStreamReader 類是從字節流到字符流的橋梁:它讀入字節,并根據指定的編碼方式,將之轉換為字符流。
    使用的編碼方式可能由名稱指定,或平臺可接受的缺省編碼方式。
  • InputStreamReader 的 read() 方法之一的每次調用,可能促使從基本字節輸入流中讀取一個或多個字節。
    **為了達到更高效率,考慮用 BufferedReader 封裝 InputStreamReader **

6 Java IO 的一般使用原則


  • 按數據來源(去向)分類:
    1 是文件: FileInputStream, FileOutputStream, ( 字節流 )FileReader, FileWriter( 字符 )
    2.是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字節流 )
    3 是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )
    4 是 String: StringBufferInputStream, StringBufferOuputStream ( 字節流 )StringReader, StringWriter( 字符流 )
    5 網絡數據流: InputStream, OutputStream,( 字節流 ) Reader, Writer( 字符流 )

  • 按是否格式化輸出分:
    1 要格式化輸出: PrintStream, PrintWriter

  • 按是否要緩沖分:
    1 要緩沖: BufferedInputStream, BufferedOutputStream,( 字節流 ) BufferedReader, BufferedWriter( 字符流 )

  • 按數據格式分:
    1 二進制格式(只要不能確定是純文本的) : InputStream, OutputStream 及其所有帶 Stream 結束的子類
    2 純文本格式(含純英文與漢字或其他編碼方式); Reader, Writer 及其所有帶 Reader, Writer 的子類

  • 按輸入輸出分:
    1 輸入: Reader, InputStream 類型的子類
    2 輸出: Writer, OutputStream 類型的子類

  • 特殊需要:
    1 從 Stream 到 Reader,Writer 的轉換類: InputStreamReader, OutputStreamWriter
    2 對象輸入輸出: ObjectInputStream, ObjectOutputStream
    3 進程間通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
    4 合并輸入: SequenceInputStream
    5 更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、流的概念和作用。 流是一種有順序的,有起點和終點的字節集合,是對數據傳輸的總成或抽象。即數據在兩設備之間的傳輸...
    布魯斯不吐絲閱讀 10,106評論 2 95
  • Java 流在處理上分為字符流和字節流。字符流處理的單元為 2 個字節的 Unicode 字符,分別操作字符、字符...
    布魯斯不吐絲閱讀 704評論 0 4
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • tags:io categories:總結 date: 2017-03-28 22:49:50 不僅僅在JAVA領...
    行徑行閱讀 2,220評論 0 3
  • 這幾天,有老同學問我:是不是寫字會上癮,現在一有時間就想做這件事?我想了一下,好像還真是,不過現在還多了一點:微信...
    郭小果子閱讀 399評論 0 1