淺談JavaIO之try with底層原理
IO關(guān)閉的問題
最近寫了一個例子,讀取一個文件沒有問題,但是讀取很多個文件就會告訴我:”Can't open so many files“,能幫我看看是什么問題嗎?可能打開文件太多了吧,用兩個命令,查看最大文件打開限制。
一個命令是
ulimit -a

第二個命令是
ulimit -n
256
看起來是最大文件限制太小了,只有256個,調(diào)大一點就可以了。
讀文件都是一個一個讀的,沒有同時開這么多文件
好吧,看下寫的代碼吧:
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,實在是太麻煩了,很多時候又怕忘記關(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就是資源,可以打開個關(guān)閉,我們可以把實現(xiàn)了java.lang.AutoCloseable接口的類都叫做resource。
先看下AutoCloseable的定義:
public interface AutoCloseable {
void close() throws Exception;
}
AutoCloseable定義了一個close()方法,當(dāng)我們在try with resource中打開了AutoCloseable的資源,那么當(dāng)try block執(zhí)行結(jié)束的時候,JVM會自動調(diào)用這個close()方法來關(guān)閉資源。
我們看下上面的BufferedReader中close方法是怎么實現(xiàn)的:
public void close() throws IOException {
synchronized (lock) {
if (in == null)
return;
in.close();
in = null;
cb = null;
}
}
自定義resource
那么我們是不是可以實現(xiàn)AutoCloseable來創(chuàng)建自己的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();
}
}
}
運行輸出結(jié)果
[main] INFO com.flydean.CustResource - 解決問題!
[main] INFO com.flydean.CustResource - 解決完問題,趕緊去吃飯!
以上就是淺談JavaIO之try with底層原理的詳細內(nèi)容,更多關(guān)于JavaIO之try with底層原理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決swaggerUI頁面沒有顯示Controller方法的坑
這篇文章主要介紹了解決swaggerUI頁面沒有顯示Controller方法的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringValidation自定義注解及分組校驗功能詳解
這篇文章主要介紹了SpringValidation自定義注解及分組校驗功能,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
使用IDEA創(chuàng)建Java Web項目并部署訪問的圖文教程
本文通過圖文并茂的形式給大家介紹了使用IDEA創(chuàng)建Java Web項目并部署訪問的教程,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
如何基于LoadingCache實現(xiàn)Java本地緩存
這篇文章主要介紹了如何基于LoadingCache實現(xiàn)Java本地緩存,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12

