對程序語言設計者來講,建立一個好的輸入輸出(I/O)系統是一項艱難的任務。java
1、流數組
流,是抽象的,要麼輸入,要麼輸出。性能優化
流是處理輸入/輸出的一種清晰方式,例如代碼中全部的部分都不須要去理解鍵盤和網絡之間的區別,只須要操做流就好了,也就是說,流屏蔽了實際IO設備中處理數據的細節。網絡
2、字節流和字符流app
java定義了兩種類型的流:字節流和字符流,兩種流都有輸入、輸出兩個內容。函數
InputStream和OutStream針對字節流和而設計,爲處理字節的輸入和輸出提供了方法。性能
Reader和Writer針對字符流而設計,爲處理字符的輸入和輸出提供了方便的方法。優化
3、關閉流編碼
一、手動關閉spa
一般,當不須要時,流必須關閉,若是沒有關閉,就可能會致使內存泄漏以及資源緊張。
從java最初發布以來就一直有關閉流的close()方法,對於這種方式,一般是在finally代碼塊中調用close()方法。
二、自動關閉
到JDK7的時候,新增了一個特性,該特性提供了另一種管理資源的方式,這種方式能自動關閉文件。
該特性以try語句的擴展版爲基礎:try(在這裏生成流){}.(try-with語法)
當try代碼塊結束時,資源會被自動關閉,它的優勢是當再也不須要文件或者其餘資源時,能夠防止無心中忘記釋放他們。
4、字節流
一、頂級抽象類
InputStream字節流的頂層抽象類,定義了java的字節流輸入模型。
方法 | 描述 |
int available() | 返回當前可讀取的輸入字節數 |
void close | 關閉輸入流 |
boolean markSupported() | 當前流是否支持打標記 |
void mark(int limit) | 在輸入流的當前位置放一個標記(並非全部的流都支持這個特性),該標記在讀入limit個字節以前一直都有效。 |
void reset() | 將輸入流的指針重置爲前面設置的標記,若是當前沒有任何標記,則指針重置到開頭。 |
int read() | 讀入一個字節,並返回該字節。(這個read方法在碰到輸入流的結尾時返回-1) |
int read(byte b[]) | 讀入一個字節數組,返回實際讀入的字節數。(在碰到數據流的結尾時返回-1,這個方法最多讀入b.length個字節) |
int read(byte[] b,int off,int len) | 讀入一個字節數組,從byte[off]開始讀,最多讀取len個字節,返回實際讀入的字節數,碰到輸入流的結尾時返回-1. |
long skip(long n) | 在輸入流中跳過n個字節,返回實際跳過的字節數。 |
OuputStream字節流的頂層抽象類,定義了java的字節流輸出模型。
方法列表:
方法 | 描述 |
void write(int n) | 寫出一個字節的數據 |
void write(byte[] b) | 寫出一個字節數組 |
void write(byte[] b,int off,int len) | 寫出一個字節數組,從b[off]開始寫,最多寫len個字節。 |
void flush() | 沖刷輸出流,結束輸出狀態。 |
void close() | 沖刷並關閉輸出流。 |
二、文件流
FileInputStream繼承於InputStream,該對象能夠用於從文件中讀取字節。
構造函數:
FileInputStream(String filePath);//文件的完整路徑 FileInputStream(File fileObj);//文件的File對象
這兩個構造器都會拋出FileNotFoundException異常。
FileOutputStream繼承於OutputStream,該對象能夠將字節寫入文件。
構造函數:
FileOutputStream(String filePath) FileOutputStream(String filePath,boolean append) FileOutputStream(File fileObj) FileOutputStream(File fileObj,boolean append)
和FileInputStream同樣,不一樣的是有一個append參數,這個參數若是爲true,則以追加的方式打開文件,不然,這個方法會刪除同名的已有文件建立一個新的輸出流。另外,若是試圖打開只讀文件會拋出異常。
三、字節緩衝流
對於面向字節的流,緩衝流經過將內存緩衝區附加到IO系統來擴展過濾流。這種流容許java一次對多個字節執行屢次IO操做,從而提高性能。
由於可使用緩衝區,因此略過、標記、或重置流都是可能發生的,BufferedInputStream類、BufferedOutputStream類、PushbackInputStream類都實現了緩衝流。
BufferedInputStream類
緩衝IO是很常見的性能優化手段,BufferedInputStream類容許將任何InputStream對象封裝到緩衝流中以提升性能,由於帶緩衝區的輸入流從流中讀入字符時,不會每次都對設備訪問。
構造函數:
BufferedInputStream(InputStream inputStream) BufferedInputStream(InputStream inputStream,int bufSize)
緩衝輸入流除了任何InputStream都實現了的read()和skip()方法外,還支持mark()和reset()方法。
BufferedOutputStream類
建立一個帶緩衝區的輸出流,帶緩衝區的輸出流在收集要寫出的字符時,不會每次都對設備訪問,當緩衝區填滿或者當流被沖刷時,數據就被寫出,所以調用flush()方法纔是數據刷盤。
構造函數:
BufferedOutputStream(OutputStream outputStream) BufferedOutputStream(OutputStream outputStream,int bufSize)
PushbackInputStream類
一個能夠預覽字節的輸入流,它讀取字節,但並不破壞他們,讀取後能夠再將他們回推到輸入流中,下次調用read()時能夠再次被讀取。
構造函數:
PushbackInputStream(InputStream inputStream) PushbackInputStream(InputStream inputStream,int num)
第一個構造函數建立的流對象容許將一個字節回推到輸入流。
第二個構造函數建立的流對象具備一個長度爲num的回推緩衝區,從而容許將多個字節回推到輸入流中。
四、打印流
PrintStream類
用的最多的System.out.println()就是PrintStream類裏的方法。
PrintStream最初的目的是爲了以可視化格式打印全部的基本數據類型以及String對象,它的最重要的兩個方法:print()和println()能夠打印出各類類型,若是參數不是基本類型,那麼會自動調用對象的toString()方法並顯示結果。
5、字符流
一、頂級抽象類
Reader字符流的頂級抽象類,定義了java字符流的輸入模型。
方法列表:
方法 | 描述 |
int read() | 讀取一個字符,返回表示該字符的證書,若是達到文件末尾,則返回-1 |
int read(char buff[]) | 讀取buff.length個字符,返回成功讀取的字符數,若是達到文件末尾,則返回-1 |
int read(CharBuffer buff) | 讀取字符,返回成功讀取的字符數,若是達到文件末尾,則返回-1 |
int read(char buff[],int offset,int num) | 從buff[offset]開始讀,讀取num個字符,若是文件達到末尾,則返回-1 |
long skip(long num) | 跳過num個字符,返回實際跳過的字符數 |
void close() | 關閉輸入流,若是試圖繼續讀取,會產生IO異常 |
boolean ready() | 若是下一個輸入請求不等待,就返回true,不然返回false |
boolean markSupported() | 若是這個流支持mark或者reset,就返回true |
void mark(int num) | 在當前流的位置放置標記,該標記在reset()以前一直有效 |
void reset() | 將輸入指針從新設置爲前面設置的標記位置 |
Writer字符流的頂級抽象類,定義了java字符流的輸出模型。
方法列表:
方法 | 描述 |
Writer append(char cn) | 將cn追加到調用輸出流的末尾,返回對調用流的引用 |
Writer append(CharSequence chars) | 將chars追加到調用輸出流的末尾,返回對調用流的引用 |
Writer append(CharSequence chars,int begin,int end) | 將chars從begin到end-1之間的字符追加到輸出流的末尾,返回對調用流的引用 |
void close() | 關閉輸出流,若是試圖繼續向其中寫入內容,將產生IO異常 |
void flush() | 完成輸出狀態,從而清空全部緩衝區,即刷新輸出緩衝區 |
void write(int ch) | 寫入一個字符到輸出流中 |
void write(char buff[]) | 將整個字符數組寫入輸出流中 |
void write(char buff[],int offset,int num) | 將buff數組中從buff[offset]開始的num個字符寫入輸出流中 |
void write(String str) | 將str寫到輸出流中 |
void write(String str,int offset,int num) | 將字符串str中從offset開始寫,寫num個字符 |
二、文件流
FileReader類
FileReader類能夠建立用於讀取文件內容的Reader對象。
注意:FileReader 用於讀取字符流。要讀取原始字節流,請考慮使用 FileInputStream。
構造函數:
FileReader(String filePath)
FileReader(File fileObj)
FileWriter類
FileWriter類能夠建立可以用於寫入文件的Writer對象。
文件是否可用或是否能夠被建立取決於底層平臺。特別是某些平臺一次只容許一個 FileWriter(或其餘文件寫入對象)打開文件進行寫入。在這種狀況下,若是所涉及的文件已經打開,則此類中的構造方法將失敗。
FileWriter 用於寫入字符流。要寫入原始字節流,請考慮使用 FileOutputStream
。
構造函數:
FileWriter(String filePath) FileWriter(String filePath,boolean append) FileWriter(File fileObj) FileWriter(File fileObj,boolean append)
append參數表明是否追加到文件末尾。
三、緩衝流
BufferedReader類
BufferedReader類經過緩衝輸入提升性能,該類具備兩個構造函數:
BufferedReader(Reader inputStream) BufferedReader(Reader inputStream,int bufSize)
第二個構造函數指定建立bufSize大小的緩衝字符流。
與面向字節的流同樣,緩衝的輸入字符流也實現了mark()和reset()方法,而且markSupported()會返回true.
BufferedWriter類
BufferedWriter是緩衝輸出的Writer,使用BufferedWriter能夠經過減小實際向輸出設備物理的寫入數據的次數來提升性能。
構造函數:
BufferedWriter(Writer outputStream) BufferedWriter(Writer outputStream,int bufSize)
第一種形式建立的緩衝流使用具備默認大小的緩衝區,在第二種形式中緩衝區的大小是由bufSize指定的。
四、打印流
PrintWriter類
PrintWriter本質上是PrintStream的面向字符的版本。
構造函數:
PrintWriter(OutputStream outputStream) PrintWriter(OutputStream outputStream,boolean autoFlushingOn) PrintWriter(Writer outputStream) PrintWriter(Writer outputStream,boolean autoFlushingOn)
autoFlushingOn參數控制每次調用println()/printf()或format()方法時,是否自動刷新輸出緩衝區,若是爲true,就自動刷新,不然不自動刷新,沒有指定的構造函數不自動刷新。
PrintWriter(File outputFile)
PrintWriter(File outputFile,String charSet)
PrintWriter(String outputFileName)
PrintWriter(String outputFileName,String charSet)
這幾個構造函數容許從File對象或根據文件路徑建立PrintWriter對象,對於每種形式,都會自動建立文件,全部以前存在的同名文件都會被銷燬。一旦建立PrintWriter對象,就將全部輸出定向到指定文件,能夠經過charSet傳遞的名稱來指定字符編碼。