1. 程式人生 > >IO流(二)和異常處理

IO流(二)和異常處理

IO流(二)
1. 流的分類
1.1 按流的流向分類
輸入流和輸出流
輸入流是從其他地方(硬碟、外部儲存、網路等)往記憶體中讀取資料。
輸出流是從記憶體往其他地方(硬碟、外部儲存、網路等)寫入資料。
輸入和輸出流的方向是相對於記憶體而言的
1.2 按流的傳輸單位分類
位元組流和字元流
位元組流是基於8位的位元組作為操作的資料單元。
字元流是基於16位的字元作為操作的資料單元。
字元流可以看成特殊的位元組流
1.3 按功能分類
節點流和處理流
直接從資料來源讀/寫資料的流,稱為節點流。
對一個已經存在的流進行連線封裝,通過封裝後的流來實現資料讀/寫功能,即為處理流。
2. 流的基類
2.1 InputStream
2.1.1 InputStream簡介
InputSteam是位元組輸入流的抽象基類,本身不能建立例項來進行輸入,但是有豐富的子類去實現不同的功能,它類似於一個模板,所以它的方法將是所有輸入流都可使用的方法
2.1.2 InputStream常用方法
● int read(); 從輸入流中讀取單個位元組,返回所讀取的位元組資料,轉化成為int型別
● int read(byte[] b); 從輸入流中最多讀取位元組陣列b的長度個位元組資料,並且儲存在b中,返回值表示本次讀取實際讀取的位元組數
● int read(byte[] b, int off, int len); 從輸入流中最多讀取len個位元組的資料,並存儲在位元組陣列b中,並不是從陣列的開頭放入的,而是從off位置開始,返回實際讀取的位元組數
● void close(); 關閉此輸入流並釋放與此流關聯的所有系統資源
● long skip(long n); 跳過和丟棄此輸入流中資料的 n 個位元組,返回實際跳過的位元組數
2.2 OutputStream
2.2.1 OutputStream簡介
OutputStream是所有位元組輸出流的抽象父類,和InputStream是對應的,它也有自己的一系列方法
2.2.2 OutputStream常用方法
● void write(int c); 將指定的位元組輸出到輸出流中
● void write(byte[] b); 將位元組陣列中的資料輸出到指定的輸出流中
● void write(byte[] b, int off, int len); 將位元組陣列中的off位置開始,長度為len的位元組輸出到輸出流中
2.3 Reader
2.3.1 Reader簡介
Reader是字元輸入流的抽象基類,和InputStream的用法非常相似,唯一的區別在於對位元組的操作變成了對字元的操作
2.3.2 Reader常用方法
● int read(); 從輸入流中讀取單個字元,返回所讀取的字元資料,轉化為int型別
● int read(char[] c); 從輸入流中最多讀取字元陣列c的長度個字元資料,並且儲存在c中,返回值表示本次讀取實際讀取的字元數
● int read(char[] c, int off, int len); 從輸入流中最多讀取len個字元的資料,並存儲在字元陣列c中,
並不是從陣列的開頭放入的,而是從off位置開始,返回實際讀取的字元數
● void close(); 關閉此輸入流並釋放與此流管理的所有系統資源
● long skip(long n); 跳過輸入流中的n個字元,返回實際跳過的字元數
2.4 Writer
2.4.1 Writer簡介
Writer是字元輸出流,和Reader是對應的,基本用法和OutputStream類似,但是因為字元流直接以字元作為操作單位,所以Writer相對於位元組輸出流還多了幾個方法
2.4.2 Writer常用方法
● void write(int c); 將指定的字元輸出到輸出流中
● void write(char[] c); 將字元陣列中的資料輸出到指定的輸出流中
● void write(char[] c, int off, int len); 將字元陣列中從off開始,長度為len的字元資料輸出到輸出流中
● void write(String str); 將str字串裡包含的字元輸出到指定的輸出流中
● void write(String str, int off, int len); 將str字串裡從off位置開始,長度為len的字元輸出到輸出流中
3. 常用的流的實現類
3.1 檔案流
● FileInputStream類
● FileOutputStream類 輸出流可以建立新檔案,不可以新建目錄,預設情況下,每個輸出流物件都是全覆蓋的寫入內容,如果方法的第二個引數是true,就會追加的寫入內容,而不是覆蓋。
● FileReader類
● FileWriter類
3.2 記憶體流
● ByteArrayInputStream類
● ByteArrayOutputStream類
● CharArrayReader類
● CharArrayWriter類
● StringReader類
● StringWriter類
3.3 緩衝流
● BufferedReader類(新增了readLine()方法用於一次讀取一行字串(以‘\r’或‘\n’認為一行結束))
● BufferedWriter類(新增了newLine()方法用於寫出一個行分隔符)
● 注意
對於緩衝輸出流,寫出的資料會先快取在記憶體緩衝區中,關閉此流前要用flush()方法將快取區的資料立刻寫出。關閉過濾流時,會自動關閉過濾流所包裝的所有底層流
3.4 列印流
● PrintStream類
● PrintWriter類
3.5 轉換流
● InputSreamReader類
● OutputStreamWriter類
3.6 物件流
● ObjectInputStream類
● ObjectOutputStream類
4. 隨機訪問類
4.1 RandomAccessFile類
主要功能是完成隨機讀寫功能,可以讀取指定位置的內容
4.2 構造方法
public RandomAccessFile (File file,String mode)
public RandomAccessFile (String name,String mode)
第二個引數:檔案的開啟模式(mode):
“r” 以只讀方式開啟。呼叫結果物件的任何 write 方法都將導致丟擲 IOException。
“rw” 開啟以便讀取和寫入。如果該檔案尚不存在,則嘗試建立該檔案。
4.3 常用方法
● void seek(long pos)設定檔案指標偏移量,在該位置準備開始讀寫。
● long getFilePointer()獲取此檔案中的當前偏移量
● long length()返回此檔案的長度。
● int skipBytes(int n)嘗試跳過輸入的 n 個位元組並丟棄跳過的位元組.返回實際跳過的位元組數.
5. 注意
● 當一個檔案可以用記事本開啟並且正常顯示,我們就可以用字元流來處理,也可以直接用位元組流處理,其實字元流就是特殊的位元組流
● 使用IO流切記需要關閉流,釋放資源
異常處理
1. 什麼是異常處理?
異常是程式在執行期發生的不正常的事件,它會打斷指令的正常執行流程。設計良好的程式應該在異常發生時提供處理這些不正常事件的方法,使程式不會因為異常的發生而阻斷或產生不可預見的結果。
2. 異常的分類
2.1受檢異常
編譯器要求必須處理的異常。指的是程式在執行時由於外界因素造成的一般性異常。
沒有找到指定名稱的類:java.lang.ClassNotFoundException
訪問不存在的檔案:java.io.FileNotFoundException
操作檔案時發生的異常:java.io.IOException
操作資料庫時發生的異常:java.sql.SQLException
2.2 非受檢異常(執行時異常)
編譯器不要求必須處理的異常。
一般是指程式設計時的邏輯錯誤。是程式設計師應該積極避免其出現的異常
java.lang.RuntimeException及它的子類都是非受檢異常:
錯誤的型別轉換:java.lang.ClassCastException
陣列下標越界:java.lang.ArrayIndexOutOfBoundsException
空指標訪問:java.lang.NullPointerException
算術異常(除0溢位):java.lang.ArithmeticException
3. 異常處理機制
3.1 try…catch捕獲異常
1、一旦產生異常,則首先會產生一個異常類的物件;
2、在try語句中對此異常物件進行捕捉;
3、產生的異常物件與catch語句中的各個異常型別進行匹配,如果匹配成功,則執行catch語句中的程式碼;
3.2 訪問異常資訊
getMessage() 方法,用來獲得有關異常事件的字串資訊。
printStackTrace() 方法,用來跟蹤異常事件發生時執行堆疊的內容。
3.3 使用finally回收資源
finally語句為異常處理提供一個統一的出口,使得在控制流轉到程式的其它部分以前,能夠對程式的狀態作統一的管理。
通常在finally語句塊中可以進行資源的清理工作,如:
關閉開啟的檔案
刪除臨時檔案
關閉資料庫的連線等
3.4 注意
● 使用多重 catch 語句時,異常子類一定要位於異常父類之前。
● 如果沒有異常產生,所有的catch段的程式碼都會被忽略不執行。
● 無論在try程式碼塊中是否發生了異常事件,finally塊中的語句都會被執行。
● finally語句是可選的,如果寫了finally語句,可以沒有catch語句
4.異常的丟擲
● 在定義一個方法的時候可以使用throws關鍵字宣告,使用throws宣告的方法表示此方法不處理異常,而交給方法的呼叫處進行處理。
● throw關鍵字 (throw關鍵字用在方法程式碼中主動丟擲一個異常)
● throws關鍵字 ( throws用來宣告一個方法可能會丟擲的所有異常。跟在方法簽名的後面)