Java IO關閉流的方式
阿新 • • 發佈:2019-01-14
所有的流,無論是輸入流還是輸出流,使用完畢之後,都應該關閉。 如果不關閉,會產生對資源佔用的浪費。 當量比較大的時候,會影響到業務的正常開展。
1>在try中關閉
public static void fis1() { try { File file = new File("test.html"); //檔案輸入流物件:指定當前讀取的檔名 FileInputStream fis = new FileInputStream(file); System.out.println("檔案大小:" + file.length()); //讀取檔案,一個一個讀 // int length = fis.read(); // System.out.println(length); // System.out.println("未讀取剩餘的大小:" + fis.available()); int length=0; while((length=fis.read())!=-1){ System.out.print((char)length); } //關閉流 fis.close(); } catch (Exception e) { e.printStackTrace(); } }
說明:在try的作用域裡關閉檔案輸入流,在示例中都是使用這種方式,這樣做有一個弊端;
如果檔案不存在,或者讀取的時候出現問題而丟擲異常,那麼就不會執行這一行關閉流的程式碼,存在巨大的資源佔用隱患。 不推薦使用。
2>在finally中關閉
/** * 傳統關閉方式 try..catch..finally */ public static void fis3() { FileInputStream fis =null; try { File file = new File("test.html"); //檔案輸入流物件:指定當前讀取的檔名 fis = new FileInputStream(file); int length=0; //中轉站 byte[] by=new byte[(int) file.length()]; //批量讀取 length=fis.read(by,10,by.length-10); System.out.print(new String(by)); } catch (Exception e) { e.printStackTrace(); }finally { //關閉流 try { if(fis!=null) fis.close(); } catch (IOException e) { e.printStackTrace(); } } }
說明: 這是標準的關閉流的方式
1. 首先把流的引用宣告在try的外面,如果宣告在try裡面,其作用域無法抵達finally.
2. 在finally關閉之前,要先判斷該引用是否為空
3. 關閉的時候,需要再一次進行try catch處理
這是標準的嚴謹的關閉流的方式,但是看上去很繁瑣,所以寫不重要的或者測試程式碼的時候,都會採用上面的有隱患try的方式,因為不麻煩。
3>使用try()的方式
public static void fis4() {
File file = new File("test.html");
//檔案輸入流物件:指定當前讀取的檔名
try(FileInputStream fis = new FileInputStream(file)) {
int length=0;
//中轉站
byte[] by=new byte[(int) file.length()];
//批量讀取
length=fis.read(by,10,by.length-10);
System.out.print(new String(by));
} catch (Exception e) {
e.printStackTrace();
}
}
說明:把流定義在try()裡,try,catch或者finally結束的時候,會自動關閉。這種編寫程式碼的方式叫做 try-with-resources, 這是從JDK7開始支援的技術,所有的流,都實現了一個介面叫做 AutoCloseable,任何類實現了這個介面,都可以在try()中進行例項化。 並且在try, catch, finally結束的時候自動關閉,回收相關資源。