標籤:writer ast code inpu utf-8 modified nts class 多個
今天打算過一遍java的io,主要是關注檔案方面,當然還有什麼zip之類的。
io顧名思義就是輸入和輸出,根據操作的類型分為輸入資料流和輸出資料流,感覺流是一種通道,它給各種資料呀,檔案呀提供通道。本身還是可以理解的。在java中,所有的io的操作基本放在java.io中,所有的輸入資料流都是抽象類別InputStream和Reader的子類,前者是位元組輸入資料流,後者則是字元輸入資料流。與此對應的還有OutputStream和Writer抽象類別。位元組流讀取的時候,讀到一個位元組就返回一個位元組; 字元流使用了位元組流讀到一個或多個位元組(中文對應的位元組數是兩個,在UTF-8碼錶中是3個位元組)時。先去查指定的編碼錶,將查到的字元返回。位元組流可以處理所有類型資料,而字元流只能處理字元資料。只要是處理純文字資料,就要優先考慮使用字元流,除此之外都用位元組流。
File類是唯一代表磁碟檔案本身的對象。通過調用File類中的方法,實現建立(createNewFile()),刪除(delete()),重新命名檔案等操作。同時此類提供了許多方法用來擷取一些檔案本身的資訊,如判斷檔案是否存在(exits()),擷取檔案長度(length()),最後修改時間(lastModified())。
當需要將資料永久儲存時,就需要使用檔案輸入輸出資料流與指定檔案建立串連。FileInputStream和FileOutputStream都用來操作磁碟檔案,前面說了這兩個類都是對位元組的操作,都只提供了對位元組和位元組數組的讀取方法,由於漢字在檔案中是佔兩個位元組的,那麼如果用這兩個類讀取漢字文本時,極大可能性會出現亂碼現象。所以對於這種現象,我們應當採用FileReader和FileWriter類。FileReader流順序地讀取檔案,只要不關閉流,每次調用read就順序地讀取源中其餘的內容,直到被close。
雖然在程式結束時自動關閉所有開啟的流,但是在使用完流後,主動close仍然是一個好習慣,一個被開啟的流可能會佔盡系統資源,如果沒有將開啟的流關閉,當另一個程式試圖開啟另一個流時,可能會得不到需要的資源。
public class FileTest{ public static void main(String[] args){ File file=new File("word.txt"); try{ FileOutputStream a=new FileOutputStream(file); byte buy[]="你好java".getBytes(); a.write(buy); a.close(); }catch(Excetion e){ e.printStackTrace(); } try{ FileInputStream b=new FileInputStream(file); byte by[]=new byte[1024]; int h=b.read(by); System.out.println(new String(by,0,h)); b.close(); }catch(Excetion e){ e.printStackTrace(); } }}
File f=new File("d:\\hah.txt"); if(!f.exists()){ try { f.createNewFile(); } catch (IOException e) { // TODO 自動產生的 catch 塊 e.printStackTrace(); } }else{ System.out.println("哈皮"); }
我在這裡寫這個的原因是因為我當初非常愚蠢的一段經曆,我寫了這兩個測試程式,然後在思考一個問題。。為什麼第一個程式沒用createNewFile就建立了真實檔案,難道File f=new File(...)就會建立真實檔案麼。。可是我清楚的記得,File只是建立一個映射對象,並不是建立一個真實的檔案,如果有這個功能,那還要createNewFile()幹什麼。。。原來是因為我第一個程式還用了FileOutputStream..在使用檔案輸出類時,如果檔案不存在,就會自動建立檔案,使用檔案輸入類時,如果檔案不存在,就會拋出異常IOException。很蠢。。但是當時想了好長時間。。。
java---2