? ? ? ?套路是如今比較流行的一個詞翘瓮,在最近的學(xué)習(xí)中呼盆,我也發(fā)現(xiàn)了很多編程方面的套路。今天就來談?wù)凧ava文件操作中的一些套路寂殉。
? ? ? ?Java文件操作的套路大體上可以分為三步走:1.聲明IO流村怪。2.使用流。3.關(guān)閉流。我們先來討論比較簡單的第一步和第三步介时。在這之前我們先分析一段初學(xué)者寫的聲明流和關(guān)閉流:
? ? ? ? 相信好多人都是這樣做的,但考慮這樣一個問題,如果在fis或fos進(jìn)行讀寫的過程中目標(biāo)文件被刪或出現(xiàn)其他問題宏多,那么程序會中斷,并拋出異常,而此時fis和fos未被關(guān)閉,那么問題來了,這樣合理嗎萌业?
? ? ? ?所以相對合理的寫法應(yīng)該是這樣的:
? ? ? ?這就是第一步和第三步的套路:在聲明IO流時聲明在try外,實例化時在try內(nèi),而在關(guān)閉IO流時,在finally內(nèi)去關(guān)閉卡睦,這樣無論發(fā)生怎樣的異常表锻,fis和fos都一定會被關(guān)閉,從而保證安全性。
? ? ? ?其它的流都可以套用這一套路:聲明在try外旨巷,實例化時在try內(nèi)乏冀,關(guān)閉在finally內(nèi)郊闯。
? ? ? ?接下來我們來重點討論一下三步走中的第二步:
? ? ? Java中的文件讀取大體可分為按字節(jié)(byte)讀取和按字符(char)讀取,圖一和圖二都是按字節(jié)來讀取的析蝴。而在按字節(jié)讀取的時候闷畸,如果緩存區(qū)的大小設(shè)為單數(shù)字節(jié)的話倘待,例如byte[5],那么在對中文進(jìn)行讀取的時候就會發(fā)生亂碼,因為中文的編碼是兩個字節(jié)。所以在讀取時最好設(shè)置緩沖區(qū)長度為偶數(shù)或者以字符的來讀取鞠眉。
? ? ? ?按字節(jié)讀取哗戈,圖一圖二以作示例,不再討論顶掉;
? ? ? ?按字符讀取的話要借助于按字節(jié)讀取,如例:
FileInputStream fis = null;
InputStreamReader reader = null;
fis = new FileInputStream("text.txt");
reader = new InputStreamReader(fis);
? ? ? ?一個指向InputStreamReader的reader變量實例化的時候要以一個FileInputStream類型的變量作為構(gòu)造函數(shù)的參數(shù)解藻,接下來我們就可以設(shè)置一個字符數(shù)組作為緩沖區(qū)來進(jìn)行讀寫了:
FileInputStream fis = null;
InputStreamReader reader = null;
FileWriter fw = null;
fis = new FileInputStream("text.txt");
reader = new InputStreamReader(fis);
fw = new FileWriter("result.txt");
char[] b = new char[512];
int len = 0;
while ((len = reader.read(b)) > 0){
fw.write(b, 0, len);
}
? ? 要注意的是在用什么方式讀入的時候老充,就要用什么方式來寫入,這里我用的InputStreamReader來讀螟左,用FileWriter來寫入啡浊,還有其他的類也可以寫入字符,可以靈活選擇胶背。
? ? 我們?nèi)绻幌朐O(shè)置緩沖區(qū)的話巷嚣,可以用BufferedReader類來進(jìn)行一行的讀取,這需要一個InputStreamReader類的變量來作為構(gòu)造函數(shù)的參數(shù)钳吟,這里我們可以發(fā)現(xiàn)一個現(xiàn)象廷粒,InputStream,InputStreamReader红且,BufferedReader這三個類是有一定的實例化順序的:InputStream>InputStreamReader>BufferedReader坝茎,從數(shù)據(jù)形式的角度來看是這樣的byte-》char-》String,一個字符有一個或兩個字節(jié)組成暇番,一個字符串由多個字符組成景东,這樣也就不難理解為啥這三個類要嵌套使用了。也正是因為這樣奔誓,在關(guān)閉這三個流的時候要先關(guān)閉最底層的:InputStream<InputStreamReader<BufferedReader斤吐,這樣就保證了其安全性搔涝。
其他要注意的問題:
? ? ? 1.在寫入時默認(rèn)覆蓋寫入,可以通過FileInputStream("test.txt",true);這種構(gòu)造函數(shù)來在其結(jié)尾寫入和措。
? ? ? 2.讀的時候調(diào)用合理的組件可以加快讀入的速度庄呈,在寫的時候,可以以緩存的類來寫入派阱,有利于保護(hù)磁盤诬留,如BufferedOutputStream。