在咱們的平常開發中 I/O
涉及到咱們開發的方方面面,雖然早在 JDK1.5
就新增了 NIO
的概念,可是 java.io
的使用以及技巧在咱們的平常開發中仍是佔據很高的比重。java
最基本的I/O
流是 java.io
包中的抽象類 java.io.InputStream
和 java.io.OutputStream
。s有預留的設計比較早,所以並無採用如今流行的面向接口的編程思路,而是採用了抽象類。新增的I\O
相關的API則大量使用了接口。若是留的實現只是對使用者暴漏字節這個層次的細節,則能夠直接集成InputStream 或 OutputStream 類,而且提供本身二外的能力。編程
在接下來的幾個章節中,會逐章記錄
如下各類流類的詳細使用方法數組
BufferedInputStream
, BufferedOutputStream
緩衝複用流ByteArrayInputStream
, ByteArrayOutputStream
byte數組緩衝流DataInputStream
, DataOutputStream
java原生數據流ObjectInputStream
, ObjectOutputStream
對象序列化流PushbackInputStream
, PushbackOutputStream
推回流PipedInputStream
, PipedOutputStream
管道流SequenceInputStream
, SequenceOutputStream
序列流和字符流類和字符流的的裝飾類性能
Reader
, Writer
InputStreamReader
, InputStreamWriter
StringReader
, StringWriter
BufferedReader
, BufferedWriter
CharArrayReader
, CharArrayWriter
同時也會記錄一些 java8 融入 Google guava
類庫對 流類的支持。設計
輸入流 InputStream
類中包含兩類功能code
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
控制流的功能。開發
close
關閉功能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
讀取位置重置available
獲取當沒有阻塞狀況下,當前流中還有多少字節可供讀取。若是咱們每次讀取調用available方法獲取到的字節書,不如在讀取一個大文件的同時對文件的內容進行處理,若是每次讀取是都不發生阻塞,就能夠比較好的平均數據讀取和處理的時間。與InputStream類相對應的OutputStream類表示基本的輸出流,用來把數據從程序輸出到其餘地方。基本OutputStream類的對象也是在本身這個層次上操做。其中最主要的是寫入數據的write方法。
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種相似的重載形式,能夠每次寫入一個字節,也能夠寫入一個字節數組中所有或部份內容。
控制方法
close
方法flush
方法 強制要求OutputStream類對象對暫時保持內部緩衝區中的內容當即進行實際的寫入操做。由於有些OutputStream類的子類會在內部維護一個緩衝區,經過write方法寫入的數據會被首先放在這個緩衝區中,而後再摸個適合的實際執行已經緩衝的內容的寫入操做。在通常的場景中OutputStream對象的使用者通常不須要直接調用flush方法保證內部緩衝區數據成功寫入。這是由於當OutputStream類對象內部的緩衝區滿了之後,會自動執行寫入操做。OutputStram類的對象被關閉時,flush方法通常也會被自動調用。