欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談JavaIO之try with底層原理

 更新時(shí)間:2021年06月02日 09:45:38   作者:flydean  
眾所周知,所有被打開的系統(tǒng)資源,比如流、文件或者Socket連接等,都需要被開發(fā)者手動(dòng)關(guān)閉,否則隨著程序的不斷運(yùn)行,資源泄露將會(huì)累積成重大的生產(chǎn)事故。本文將介紹JavaIO之try with底層原理。

IO關(guān)閉的問(wèn)題

最近寫了一個(gè)例子,讀取一個(gè)文件沒(méi)有問(wèn)題,但是讀取很多個(gè)文件就會(huì)告訴我:”Can't open so many files“,能幫我看看是什么問(wèn)題嗎?可能打開文件太多了吧,用兩個(gè)命令,查看最大文件打開限制。

一個(gè)命令是

ulimit -a

第二個(gè)命令是

ulimit -n

256

看起來(lái)是最大文件限制太小了,只有256個(gè),調(diào)大一點(diǎn)就可以了。

讀文件都是一個(gè)一個(gè)讀的,沒(méi)有同時(shí)開這么多文件

好吧,看下寫的代碼吧:

BufferedReader bufferedReader = null;
try {
    String line;
    bufferedReader = new BufferedReader(new FileReader("trywith/src/main/resources/www.flydean.com"));
    while ((line = bufferedReader.readLine()) != null) {
        log.info(line);
    }
} catch (IOException e) {
    log.error(e.getMessage(), e);
}

看完代碼,問(wèn)題找到了,IO沒(méi)有關(guān)閉,應(yīng)該在使用之后,在finally里面把你的reader關(guān)閉。

下面這段代碼就行了:

BufferedReader bufferedReader = null;
try {
    String line;
    bufferedReader = new BufferedReader(new FileReader("trywith/src/main/resources/www.flydean.com"));
    while ((line = bufferedReader.readLine()) != null) {
        log.info(line);
    }
} catch (IOException e) {
    log.error(e.getMessage(), e);
} finally {
    try {
        if (bufferedReader != null){
            bufferedReader.close();
        }
    } catch (IOException ex) {
        log.error(ex.getMessage(), ex);
    }
}

使用try with resource

現(xiàn)在每段代碼都要手動(dòng)添加finally,實(shí)在是太麻煩了,很多時(shí)候又怕忘記關(guān)閉IO了,導(dǎo)致程序出現(xiàn)無(wú)法預(yù)料的異常。

從JDK7開始,Java引入了try with resource的新功能,把使用過(guò)后要關(guān)閉的resource放到try里面,JVM會(huì)幫你自動(dòng)close的,是不是很方便,來(lái)看下面這段代碼:

try (BufferedReader br = new BufferedReader(new FileReader("trywith/src/main/resources/www.flydean.com"))){
    String sCurrentLine;
    while ((sCurrentLine = br.readLine()) != null){
        log.info(sCurrentLine);
    }
} catch (IOException e) {
    log.error(e.getMessage(), e);
}

try with resource的原理

什么是resource呀?為什么放到try里面就可以不用自己close了?

resource就是資源,可以打開個(gè)關(guān)閉,我們可以把實(shí)現(xiàn)了java.lang.AutoCloseable接口的類都叫做resource。

先看下AutoCloseable的定義:

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

AutoCloseable定義了一個(gè)close()方法,當(dāng)我們?cè)趖ry with resource中打開了AutoCloseable的資源,那么當(dāng)try block執(zhí)行結(jié)束的時(shí)候,JVM會(huì)自動(dòng)調(diào)用這個(gè)close()方法來(lái)關(guān)閉資源。

我們看下上面的BufferedReader中close方法是怎么實(shí)現(xiàn)的:

public void close() throws IOException {
    synchronized (lock) {
        if (in == null)
            return;
        in.close();
        in = null;
        cb = null;
    }
}

自定義resource

那么我們是不是可以實(shí)現(xiàn)AutoCloseable來(lái)創(chuàng)建自己的resource呢?

我們定義這樣一個(gè)resource類:

public class CustResource implements AutoCloseable {

    public void helpSister(){
        log.info("解決問(wèn)題!");
    }

    @Override
    public void close() throws Exception {
        log.info("解決完問(wèn)題,趕緊去吃飯!");
    }

    public static void main(String[] args) throws Exception {
       try( CustResource custResource= new CustResource()){
           custResource.helpSister();
       }
    }
}

運(yùn)行輸出結(jié)果

[main] INFO com.flydean.CustResource - 解決問(wèn)題!

[main] INFO com.flydean.CustResource - 解決完問(wèn)題,趕緊去吃飯!

以上就是淺談JavaIO之try with底層原理的詳細(xì)內(nèi)容,更多關(guān)于JavaIO之try with底層原理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決swaggerUI頁(yè)面沒(méi)有顯示Controller方法的坑

    解決swaggerUI頁(yè)面沒(méi)有顯示Controller方法的坑

    這篇文章主要介紹了解決swaggerUI頁(yè)面沒(méi)有顯示Controller方法的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • SpringValidation自定義注解及分組校驗(yàn)功能詳解

    SpringValidation自定義注解及分組校驗(yàn)功能詳解

    這篇文章主要介紹了SpringValidation自定義注解及分組校驗(yàn)功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • 使用IDEA創(chuàng)建Java Web項(xiàng)目并部署訪問(wèn)的圖文教程

    使用IDEA創(chuàng)建Java Web項(xiàng)目并部署訪問(wèn)的圖文教程

    本文通過(guò)圖文并茂的形式給大家介紹了使用IDEA創(chuàng)建Java Web項(xiàng)目并部署訪問(wèn)的教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-08-08
  • JavaFX實(shí)現(xiàn)石頭剪刀布小游戲

    JavaFX實(shí)現(xiàn)石頭剪刀布小游戲

    這篇文章主要為大家詳細(xì)介紹了JavaFX實(shí)現(xiàn)石頭剪刀布小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Java實(shí)習(xí)打卡8道面試題

    Java實(shí)習(xí)打卡8道面試題

    臨近秋招,備戰(zhàn)暑期實(shí)習(xí),祝大家每天進(jìn)步億點(diǎn)點(diǎn)!本篇文章準(zhǔn)備了十道java的常用面試題,希望能夠給大家提供幫助,最后祝大家面試成功,進(jìn)入自己心儀的大廠
    2021-06-06
  • IntelliJ IDEA快速查看某個(gè)類/接口的子類或父類

    IntelliJ IDEA快速查看某個(gè)類/接口的子類或父類

    本文主要介紹了IntelliJ IDEA快速查看某個(gè)類/接口的子類或父類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 利用Java實(shí)現(xiàn)輕松解析DNS報(bào)文

    利用Java實(shí)現(xiàn)輕松解析DNS報(bào)文

    這篇文章主要為大家詳細(xì)介紹了如何利用Java實(shí)現(xiàn)輕松解析DNS報(bào)文,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-11-11
  • SpringBoot如何獲取客戶端的IP地址

    SpringBoot如何獲取客戶端的IP地址

    這篇文章主要介紹了SpringBoot如何獲取客戶端的IP地址問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • jmeter如何自動(dòng)生成測(cè)試報(bào)告

    jmeter如何自動(dòng)生成測(cè)試報(bào)告

    這篇文章主要介紹了jmeter如何自動(dòng)生成測(cè)試報(bào)告,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 如何基于LoadingCache實(shí)現(xiàn)Java本地緩存

    如何基于LoadingCache實(shí)現(xiàn)Java本地緩存

    這篇文章主要介紹了如何基于LoadingCache實(shí)現(xiàn)Java本地緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論