1. 程式人生 > >Java IO關閉流的方式

Java IO關閉流的方式

    所有的流,無論是輸入流還是輸出流,使用完畢之後,都應該關閉。 如果不關閉,會產生對資源佔用的浪費。 當量比較大的時候,會影響到業務的正常開展。

   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結束的時候自動關閉,回收相關資源。