小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java使用Try with resources自動關閉資源

 印度阿三17 2018-11-21

Try-with-resources

Try-with-resources是Java7中一個新的異常處理機制,它能夠很容易地關閉在try-catch語句塊中使用的資源。

利用Try-Catch-Finally管理資源(舊的代碼風格)

在Java7以前,程序中使用的資源需要被明確地關閉,這個體驗有點繁瑣。

下面的方法讀取文件,然后用System.out打印:

private static void printFile() throws IOException {
    InputStream input = null;
    try {
        input = new FileInputStream("file.txt");
        int data = input.read();
        while(data != -1){
            System.out.print((char) data);
            data = input.read();
        }
    } finally {
        if(input != null){
            input.close();
        }   
    }       
}   


上面代碼中黑體字的程序可能會拋出異常。正如你所看到的,try語句塊中有3個地方能拋出異常,finally語句塊中有一個地方會能出異常。

不論try語句塊中是否有異常拋出,finally語句塊始終會被執(zhí)行。這意味著,不論try語句塊中發(fā)生什么,InputStream 都會被關閉,或者說都會試圖被關閉。如果關閉失敗,InputStream’s close()方法也可能會拋出異常。

假設try語句塊拋出一個異常,然后finally語句塊被執(zhí)行。同樣假設finally語句塊也拋出了一個異常。那么哪個異常會根據(jù)調(diào)用棧往外傳播?

即使try語句塊中拋出的異常與異常傳播更相關,最終還是finally語句塊中拋出的異常會根據(jù)調(diào)用棧向外傳播。

在Java7中,對于上面的例子可以用try-with-resource 結構這樣寫:

private static void printFileJava7() throws IOException {

    try(FileInputStream input = 
            new FileInputStream("file.txt")) {

        int data = input.read();

        while(data != -1){
            System.out.print((char) data);
            data = input.read();
        }
    }   
}

注意方法中的第一行:

try(FileInputStream input = new FileInputStream("file.txt")) {

這就是try-with-resource 結構的用法。FileInputStream 類型變量就在try關鍵字后面的括號中聲明。而且一個FileInputStream 類型被實例化并被賦給了這個變量。

當try語句塊運行結束時,F(xiàn)ileInputStream 會被自動關閉。這是因為FileInputStream 實現(xiàn)了java中的java.lang.AutoCloseable接口。所有實現(xiàn)了這個接口的類都可以在try-with-resources結構中使用。

當try-with-resources結構中拋出一個異常,同時FileInputStreami被關閉時(調(diào)用了其close方法)也拋出一個異常,try-with-resources結構中拋出的異常會向外傳播,而FileInputStreami被關閉時拋出的異常被抑制了。這與文章開始處利用舊風格代碼的例子(在finally語句塊中關閉資源)相反。

使用多個資源

你可以在塊中使用多個資源而且這些資源都能被自動地關閉。下面是例子:

private static void printFileJava7() throws IOException {

    try(FileInputStream input = new FileInputStream("file.txt"); BufferedInputStream bufferedInput = new BufferedInputStream(input))
    {

        int data = buffereInput.read();
        while(data != -1){
            System.out.println( (char) data);
            data = bufferedInput.read();
        }
    }
}

上面的例子在try關鍵字后的括號里創(chuàng)建了兩個資源——FileInputStream 和BufferedInputStream。當程序運行離開try語句塊時,這兩個資源都會被自動關閉。

這些資源將按照他們被創(chuàng)建順序的逆序來關閉。首先BufferedInputStream 會被關閉,然后FileInputStream會被關閉。

自定義AutoCloseable 實現(xiàn)

這個try-with-resources結構里不僅能夠操作java內(nèi)置的類。你也可以在自己的類中實現(xiàn)java.lang.AutoCloseable接口,然后在try-with-resources結構里使用這個類。

AutoClosable 接口僅僅有一個方法,接口定義如下:

public interface AutoClosable{
    public void close() throws Exception;
}

任何實現(xiàn)了這個接口的方法都可以在try-with-resources結構中使用。下面是一個簡單的例子:

public class MyAutoClosable implements AutoClosable{

    public void doIt(){
        System.out.println("MyAutoClosable doing it!");
    }

    @Override
    public void close() throws Exception{
        System.out.println("MyAutoCloseable Closed!");
    }
}

doIt()是方法不是AutoClosable 接口中的一部分,之所以實現(xiàn)這個方法是因為我們想要這個類除了關閉方法外還能做點其他事。

下面是MyAutoClosable 在try-with-resources結構中使用的例子:

private static void myAutoClosable() throws Exception{
    try(MyAutoClosable myAutoClosable = new MyAutoClosable()){
        myAutoClosable.doIt();
    }
}

當方法myAutoClosable.doIt()被調(diào)用時,下面是打印到System.out的輸出:

MyAutoClosable doing it!
MyAutoClosable closed!

通過上面這些你可以看到,不論try-catch中使用的資源是自己創(chuàng)造的還是java內(nèi)置的類型,try-with-resources都是一個能夠確保資源能被正確地關閉的強大方法。

來源:http://www./content-1-83301.html

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多