色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

淺談JavaIO之try with底層原理

瀏覽:2日期:2022-08-11 13:28:29
目錄IO關閉的問題使用try with resourcetry with resource的原理自定義resourceIO關閉的問題

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

一個命令是

ulimit -a

淺談JavaIO之try with底層原理

第二個命令是

ulimit -n

256

看起來是最大文件限制太小了,只有256個,調大一點就可以了。

讀文件都是一個一個讀的,沒有同時開這么多文件

好吧,看下寫的代碼吧:

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);}

看完代碼,問題找到了,IO沒有關閉,應該在使用之后,在finally里面把你的reader關閉。

下面這段代碼就行了:

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

現在每段代碼都要手動添加finally,實在是太麻煩了,很多時候又怕忘記關閉IO了,導致程序出現無法預料的異常。

從JDK7開始,Java引入了try with resource的新功能,把使用過后要關閉的resource放到try里面,JVM會幫你自動close的,是不是很方便,來看下面這段代碼:

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就是資源,可以打開個關閉,我們可以把實現了java.lang.AutoCloseable接口的類都叫做resource。

先看下AutoCloseable的定義:

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

AutoCloseable定義了一個close()方法,當我們在try with resource中打開了AutoCloseable的資源,那么當try block執行結束的時候,JVM會自動調用這個close()方法來關閉資源。

我們看下上面的BufferedReader中close方法是怎么實現的:

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

那么我們是不是可以實現AutoCloseable來創建自己的resource呢?

我們定義這樣一個resource類:

public class CustResource implements AutoCloseable { public void helpSister(){log.info('解決問題!'); } @Override public void close() throws Exception {log.info('解決完問題,趕緊去吃飯!'); } public static void main(String[] args) throws Exception { try( CustResource custResource= new CustResource()){ custResource.helpSister(); } }}

運行輸出結果

[main] INFO com.flydean.CustResource - 解決問題!

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

以上就是淺談JavaIO之try with底層原理的詳細內容,更多關于JavaIO之try with底層原理的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 欧美日韩中文国产一区二区三区 | 97国产在线播放 | 精品国产免费一区二区三区 | 中文字幕免费观看 | 国产一级爱c片免费播放 | 久久精品视频1 | 国产三级在线观看播放 | 美女被免费网站视频软件 | 亚洲精品欧美日韩 | 精品免费久久久久欧美亚一区 | 国产亚洲一区二区三区 | 最新欧美精品一区二区三区不卡 | 国产成人精品福利网站人 | 伊人网在线免费视频 | 日本特一级毛片免费视频 | 久久熟| 成年美女黄网站小视频 | 久久夜色邦福利网 | 久久无码精品一区二区三区 | 日本一级特黄aa毛片免费观看 | 久久亚洲精品成人 | 超级碰碰碰视频视频在线视频 | 97超级碰碰碰免费公开在线观看 | 久久久久国产精品免费免费 | 日本天堂网在线 | 成人午夜亚洲影视在线观看 | 国产第一亚洲 | 日韩免费高清 | 国产成人综合网在线观看 | 国内亚州视频在线观看 | 国产三区视频在线观看 | 思99re久久这里只有精品首页 | 国产成年网站v片在线观看 国产成人aa在线视频 | 国产成人一区二区视频在线观看 | 国产aaa女人十八毛片 | 亚洲大片免费 | 午夜宅男宅女看在线观看 | 韩国19禁主播裸免费福利 | 欧美大片一区二区三区 | 国产成人精品aaaa视频一区 | 免费看毛片网 |