第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何優(yōu)雅地讀取文件中的每一行?

如何優(yōu)雅地讀取文件中的每一行?

牧羊人nacy 2019-04-09 20:24:34
最近文件操作較多,但大多數(shù)都是一行一行地讀取,每一行是一條新聞。經(jīng)常用的代碼是這樣的:InputStreamis=null;try{is=newFileInputStream(textPath);BufferedReaderreader=newBufferedReader(newInputStreamReader(is,"UTF-8"),512);//讀取一行,存儲(chǔ)于字符串列表中for(Stringline=reader.readLine();line!=null;line=reader.readLine()){line=line.trim();//dosomethinghere}}catch(FileNotFoundExceptionfnfe){fnfe.printStackTrace();}catch(IOExceptionioe){ioe.printStackTrace();}finally{try{if(is!=null){is.close();is=null;}}catch(IOExceptione){e.printStackTrace();}}當(dāng)dosomething變得很龐大時(shí),這try語句塊就變得有點(diǎn)臃腫。是否能存在這樣的一個(gè)文件讀取類,就像Iterator迭代器一樣,使用hasNext()和next()遍歷文件中的所有行,而將異常處理等全部隱藏起來?還是有什么其它更加優(yōu)雅的方法?
查看完整描述

2 回答

?
慕妹3146593

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超9個(gè)贊

java當(dāng)然可以很優(yōu)雅,宇宙第一的編程語言也不是光靠sun和oracle忽悠出來的.
這里我們需要把文件處理的邏輯和業(yè)務(wù)邏輯分開,引入strategy模式是比較合適的.文件處理的部分是不變的可以重用的,業(yè)務(wù)邏輯是變化的.
還有就是java7引入try-with-resource,已經(jīng)不需要自己去關(guān)閉流了.
代碼:
publicinterfaceFileProcessor{
voidprocessByLine(StringFilePath,LineProcessorprocessor);
}
publicinterfaceLineProcessor{
voiddoSomeThing(StringoneLine);
}
publicclassFileProcessorImplimplementsFileProcessor{
@Override
publicvoidprocessByLine(StringfilePath,LineProcessorprocessor){
try(BufferedReaderbr=
newBufferedReader(newFileReader(filePath))){
Stringline=br.readLine();
processor.doSomeThing(line.trim());
}catch(FileNotFoundExceptionfnfe){
fnfe.printStackTrace();
}catch(IOExceptionioe){
ioe.printStackTrace();
}
}
}
publicclassFileProcessImplTest{
@Test
publicvoidtestProcessByLine(){
finalStringBuildersb=newStringBuilder();
finalStringBuildersb1=newStringBuilder();
FileProcessorfp=newFileProcessorImpl();
fp.processByLine("a.txt",newLineProcessor(){
@Override
publicvoiddoSomeThing(StringoneLine){
sb.append(oneLine);
}
});
fp.processByLine("a_reverse_by_line.txt",newLineProcessor(){
@Override
publicvoiddoSomeThing(StringoneLine){
sb1.append(newStringBuilder(oneLine).reverse());
}
});
assertEquals(sb.toString(),sb1.toString());
}
}
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-09
?
慕哥9229398

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊

可以使用commons-io的FileUtils:
LineIterator:
importorg.apache.commons.io.FileUtils;
importorg.apache.commons.io.LineIterator;
finalLineIteratorit=FileUtils.lineIterator(newFile(""),"UTF-8");
try{
while(it.hasNext()){
finalStringline=it.nextLine();
}
}finally{
it.close();
}
如果內(nèi)存足夠:
importorg.apache.commons.io.Charsets;
importorg.apache.commons.io.FileUtils;
finalListlines=FileUtils.readLines(newFile(""),Charsets.UTF_8);
另外推薦LZ使用org.apache.commons.io.Charsets.UTF_8代替字符串的"UTF-8",如:
//不會(huì)拋出UnsupportedEncodingException
newInputStreamReader(is,Charsets.UTF_8)
str.getBytes(Charsets.UTF_8);
因?yàn)镴ava規(guī)定了所有平臺(tái)都必須實(shí)現(xiàn)UTF-8,這里本來就不可能拋出UnsupportedEncodingException。Java7中我們就可以用java.nio.charset.StandardCharsets了,Java6暫時(shí)拿這個(gè)頂一下。
另外LZ可以用org.apache.commons.io.IOUtils.closeQuietly來關(guān)閉一個(gè)流。你的finally塊可以簡(jiǎn)化為:
finnaly{
IOUtils.closeQuiety(is);
}
                            
查看完整回答
反對(duì) 回復(fù) 2019-04-09
  • 2 回答
  • 0 關(guān)注
  • 372 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)