我們通常在讀寫文件的時候需要捕獲異常並關閉流,如下所示:
public static void test1() { Student[] students = new Student[3]; students[0] = new Student("小麗", 2, 17); students[1] = new Student("小明", 1, 19); students[2] = new Student("小芳", 2, 18); PrintWriter out = null; try { out = new PrintWriter("D:/test/ddd.txt","UTF-8"); writeData(students, out); } catch (IOException e) { e.printStackTrace(); } finally { if(out != null) { out.close(); } } }
如上面的情況,在業務都做完了,最後需要關閉流的時候還要判斷一下,是否正常結束之後才能手動關閉。而有時如果忘記關閉那麼在流中的數據在有緩存的情況下將不會被刷新到終端。這樣我們取到的數據將會不全,並且程序在一次次的啓動中都沒有將流關閉,那麼會內存溢出。所有手動關閉即麻煩也“危險”,在java1.7後出了新的的表達式來解決這個問題,如下所示:
public static void test2() { Student[] students = new Student[3]; students[0] = new Student("小麗", 2, 17); students[1] = new Student("小明", 1, 19); students[2] = new Student("小芳", 2, 18); try(PrintWriter out = new PrintWriter("D:/test/ddd2.txt","UTF-8"); Scanner in = new Scanner(new FileInputStream("D:/test/ddd2.txt"), "UTF-8")){ writeData(students, out); } catch (IOException e) { e.printStackTrace(); } }
功能和上面的一樣,只不過是將語法從:try{}catch{}finaliy{} 變成了 try(){}catch{},凡是在try的括號中聲明的類都必須實現java.io.Closeable接口,這樣try就會自動將聲明的流在使用完畢後自動關閉。