Java中的文件操作還有點小複雜···
在講Java中的文件操作前,先了解一個概念——“流”,比如我們把一個杯子的水倒到另一個同樣大小的杯子,就是以流的方式處理的(如果你把水凍成冰了再整個放進去就當我沒說吧 - -)。
其實我的理解很簡單,“流”就是一串數據,至於這一串數據中每個數據單元有多大,Java中提供了兩種處理方法:字節流和字符流。
無論是字節流還是字符流,根據處理方式又可以分爲輸入流和輸出流。這一篇,我們就來簡單學學字節流和字符流的輸入和輸出。
一、字節流
字節都知道吧?
什麼?不知道!!!好吧,不知道就不知道吧,那就簡單說說,計算機保存數據的最小單位是bit(位),這是一個二進制單位,它的值只有0和1。
一個字節就是一個Byte(注意這是大B,那個是小b),一個字節佔8bit的大小。像現在的操作系統有什麼32位啊64位啊,主要就是處理數據的時候有區別,32位的每次處理的最小單位是4個字節,而64的是8個字節。具體還有很多區別之處,這兒我們就沒必要細說了。如果感興趣的話,那就百度走起!!!
其實文件操作很簡單,跟趙本山小品中把大象放進冰箱的步驟是一樣一樣滴。
第一步:打開冰箱門
第二步:把大象放進去(或者拿出來)
第三步:關閉冰箱
因爲無論讀文件還是寫文件的步驟都一樣,只不過使用的類不一樣,所以我們直接來看看如何複製文件吧。
/** * 字節流方式複製文件(任何文件都可以複製) * @param oldFile 被複制文件 * @param newFile 複製後的文件 */ public static void copyFile(String oldFile, String newFile){ File srcFile = new File(oldFile); //源文件對象 File destFile = new File(newFile); //目標文件對象 try { if (!(destFile.exists())) { //判斷目標文件是否存在 destFile.createNewFile(); //如果不存在則創建新文件 } //使用源文件對象創建文件輸入流對象 FileInputStream fis = new FileInputStream(srcFile); //使用目標文件對象創建文件輸出流對象 FileOutputStream fos = new FileOutputStream(destFile); byte[] buf = new byte[1024]; //創建字節數組,作爲臨時緩衝,每次讀取的數據量 System.out.println("開始複製文件..."); while (fis.read(buf) != -1) { //循環從文件輸入流中讀取數據,-1表示讀完了文件 fos.write(buf); //寫入到文件輸出流中 } System.out.println("文件複製成功!"); fis.close(); //關閉流 fos.close(); } catch (Exception e) { e.printStackTrace(); } }
裏面涉及到的幾個對象簡單介紹一下吧。
1.File類:既可以表示文件,也可以表示目錄。常用的方法如下:
2.FileInputStream類:繼承於InputStream類,用於讀文件,以字節方式將文件中的數據輸入到內存中。
3.FileOutputStream類:繼承於OutputStream類,用於寫文件,以字節方式將內存中的數據輸出到文件中。
注意:因爲是以字節的方式讀或寫,所以在處理的過程中,文件是無法使用的,就和我們在網上下載文件是一樣滴道理。
二、字符流
字符流就很好理解了,以字符爲最小單位來處理數據,一般用於處理文本類的文件比較方便,很多小說閱讀器讀取TXT的小說就使用這種方式來處理。
接下來,分別寫兩個方法以字符流的方式來處理文本文件。
2.1逐行讀取文件內容,並顯示到控制檯
/** * 讀取文本文件內容 * @param path 文件路徑 */ public static void txtRead(String path){ File file = new File(path); try { //通過文件對象創建文件讀取流對象 FileReader fr = new FileReader(file); //將文件讀取流包裝成緩衝讀取流 BufferedReader br = new BufferedReader(fr); String str; //逐行讀取數據 while ((str = br.readLine()) != null){ System.out.println(str); } br.close(); //關閉流 fr.close(); //關閉流 } catch (Exception e) { e.printStackTrace(); } }
2.2將輸入的文本保存到文件
/** * 寫入文本文件 * @param path 文件路徑 */ public static void txtWriter(String path){ File file = new File("test.txt"); try { //通過文件對象創建文件輸出字符流對象 FileWriter fw = new FileWriter(file); //將文件輸出字符流包裝成緩衝流 BufferedWriter bw = new BufferedWriter(fw); bw.write("大家好!"); bw.write("我正打算放棄Java,"); bw.newLine(); //換個新行 bw.write("請多多指教。"); bw.close(); //關閉流 fw.close(); //關閉流 } catch (Exception e) { e.printStackTrace(); } }
OK,文件的基本操作就介紹這到兒吧,其實實際開發用得更多的一種方式是序列化和反序列化,這個操作的代碼比較簡單,就不在這兒介紹了,有興趣的小夥伴自行百度一下吧。
“軟件思維”博客地址:51CTO,博客園,感興趣的小夥伴可以去看相關的其它博文。