淺談JavaIO之try with底層原理
最近寫了一個(gè)例子,讀取一個(gè)文件沒有問題,但是讀取很多個(gè)文件就會告訴我:”Can’t open so many files“,能幫我看看是什么問題嗎?可能打開文件太多了吧,用兩個(gè)命令,查看最大文件打開限制。
一個(gè)命令是
ulimit -a
第二個(gè)命令是
ulimit -n
256
看起來是最大文件限制太小了,只有256個(gè),調(diào)大一點(diǎn)就可以了。
讀文件都是一個(gè)一個(gè)讀的,沒有同時(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);}
看完代碼,問題找到了,IO沒有關(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)在每段代碼都要手動添加finally,實(shí)在是太麻煩了,很多時(shí)候又怕忘記關(guān)閉IO了,導(dǎo)致程序出現(xiàn)無法預(yù)料的異常。
從JDK7開始,Java引入了try with resource的新功能,把使用過后要關(guān)閉的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就是資源,可以打開個(gè)關(guān)閉,我們可以把實(shí)現(xiàn)了java.lang.AutoCloseable接口的類都叫做resource。
先看下AutoCloseable的定義:
public interface AutoCloseable {void close() throws Exception;}
AutoCloseable定義了一個(gè)close()方法,當(dāng)我們在try with resource中打開了AutoCloseable的資源,那么當(dāng)try block執(zhí)行結(jié)束的時(shí)候,JVM會自動調(diào)用這個(gè)close()方法來關(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來創(chuàng)建自己的resource呢?
我們定義這樣一個(gè)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(); } }}
運(yùn)行輸出結(jié)果
[main] INFO com.flydean.CustResource - 解決問題!
[main] INFO com.flydean.CustResource - 解決完問題,趕緊去吃飯!
以上就是淺談JavaIO之try with底層原理的詳細(xì)內(nèi)容,更多關(guān)于JavaIO之try with底層原理的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. ASP常用日期格式化函數(shù) FormatDate()2. 利用FastReport傳遞圖片參數(shù)在報(bào)表上展示簽名信息的實(shí)現(xiàn)方法3. ASP中if語句、select 、while循環(huán)的使用方法4. HTML中的XML數(shù)據(jù)島記錄編輯與添加5. ASP.NET Core按用戶等級授權(quán)的方法6. 詳解瀏覽器的緩存機(jī)制7. phpstudy apache開啟ssi使用詳解8. ASP新手必備的基礎(chǔ)知識9. 推薦一個(gè)好看Table表格的css樣式代碼詳解10. .NET 中配置從xml轉(zhuǎn)向json方法示例詳解
