Java I/O系統

對程序語言設計者來講,建立一個好的輸入輸出(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傳遞的名稱來指定字符編碼。

相關文章
相關標籤/搜索