java try(){}catch(){}自動資源釋放

風泊月發表於2018-08-11

探索更簡單的關流方式 

/**
 * 關閉流測試
 * 通過讀寫檔案進行測試
 * @author Mr.Gao
 */
public class ExceptionCloseTest {
	public static void main(String[] args) {
		copy();
	}
	/**
	 * 使用緩衝流完成檔案的複製
	 */
	private static void copy() {
		//1.建立緩衝流
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try{
			//2.緩衝流的初始化
			bis = new BufferedInputStream(new FileInputStream("D:\\a\\七月上.mp3"));
			bos = new BufferedOutputStream(new FileOutputStream("D:\\a\\3.mp3"));
			byte bytes[] = new byte[2048];
			int len = 0;
			//3.讀寫操作
			while((len=bis.read(bytes))!=-1){
				bos.write(bytes,0,len);
			}
			bos.flush();
		}catch(Exception e){
			e.getStackTrace();
		}finally{
			/**
			 * 關閉流的操作 最麻煩寫法
               對流逐個判斷 如果流很多 要寫很多個判斷的方法
			 */
			if(bis!=null){
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(bos!=null){
				try {
					bos.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}
	

上面關流的方式不是很友好 我們可以根據流的特性寫一個方法去關閉(改變在finally部分)

package com.fpy.exception;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 關閉流測試 通過讀寫檔案進行測試
 * 
 * @author Mr.Gao
 */
public class ExceptionCloseTest {
	public static void main(String[] args) {
		copy();
	}

	/**
	 * 使用緩衝流完成檔案的複製
	 */
	private static void copy() {
		// 1.建立緩衝流
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		try {
			// 2.緩衝流的初始化
			bis = new BufferedInputStream(new FileInputStream("D:\\a\\七月上.mp3"));
			bos = new BufferedOutputStream(new FileOutputStream("D:\\a\\3.mp3"));
			byte bytes[] = new byte[2048];
			int len = 0;
			// 3.讀寫操作
			while ((len = bis.read(bytes)) != -1) {
				bos.write(bytes, 0, len);
			}
			bos.flush();
		} catch (Exception e) {
			e.getStackTrace();
		} finally {
			//作為實參傳入close()自定義方法
			close(bis);
			close(bos);
		}
	}

	/**
	 * 基本上所學的流都實現了Closeable 介面 
	 * 所以可以使用多型的知識進行簡化操作
	 * @param clo 表面是Closeable型別 實際上傳入的流是誰那麼關閉的流就是誰
	 */
	private static void close(Closeable clo) {//多型
		if (clo != null) {
			try {
				clo.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

         看到這裡會發現 我們只需要一個方法即可完成關流的操作,那麼還有沒有更簡單的方法呢?我自己不想手動去關流,能不能自動關流呢?

         答案是可以的(改變在去掉finally部分)

package com.fpy.exception;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 關閉流測試 通過讀寫檔案進行測試
 * 
 * @author Mr.Gao
 */
public class ExceptionCloseTest {
	public static void main(String[] args) {
		copy();
	}
	/**
	 * 使用緩衝流完成檔案的複製
	 */
	private static void copy() {
		// 1.建立緩衝流
		/**
		 * 使用java7的新特性 try(流的宣告){
		 *   業務操作
		 * }catch(){};
		 * 不用再寫關流的操作,內部自動完成資源的釋放
		 * 
		 * 注意:沒有   七月上1.mp3  資源
		 */
		try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\a\\七月上1.mp3"));
				BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\a\\3.mp3"));) {
			byte bytes[] = new byte[2048];
			int len = 0;
			// 3.讀寫操作
			while ((len = bis.read(bytes)) != -1) {
				bos.write(bytes, 0, len);
			}
			bos.flush();
			System.out.println("Suucess");
		} catch (FileNotFoundException e) {
			//e.printStackTrace();
			System.out.println(e.getMessage());
			
		} catch (IOException e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}
}

執行效果:

相關文章