1.27k likes | 1.38k Views
第 7 章 Java的檔案處理. Java 2 程式設計入門與應用. 目錄. 7-1 認識檔案處理 7-2 資料夾與檔案處理 7-3 文字檔的輸入與輸出 7-4 二進位檔的輸入與輸出 7-5 隨機檔 7-6 標準輸入與輸出 溫故知新 自我突破習題. 7-1 認識檔案處理. 7-1.1 檔案類型與資料流 7-1.2 Java 的檔案處理類別. 前言:. 所謂的檔案就是儲存在電腦磁碟中的資料,包含文字、圖片、影片、聲音等格式,利用程式將這些檔案輸入與輸出( Input/Output ,簡稱 I/O )就稱為檔案處理。.
E N D
第7章 Java的檔案處理 Java 2 程式設計入門與應用
目錄 • 7-1 認識檔案處理 • 7-2 資料夾與檔案處理 • 7-3 文字檔的輸入與輸出 • 7-4 二進位檔的輸入與輸出 • 7-5 隨機檔 • 7-6 標準輸入與輸出 • 溫故知新 • 自我突破習題
7-1 認識檔案處理 • 7-1.1 檔案類型與資料流 • 7-1.2 Java的檔案處理類別
前言: • 所謂的檔案就是儲存在電腦磁碟中的資料,包含文字、圖片、影片、聲音等格式,利用程式將這些檔案輸入與輸出(Input/Output,簡稱I/O)就稱為檔案處理。
7-1.1 檔案類型與資料流 • 電腦的檔案有多種儲存格式,大致上可將檔案分為文字檔(Text File)與二進位檔(Binary File)兩種格式。 • 所謂文字檔就是可以在文字編輯器中閱讀與編輯的檔案,例如:文字檔案、Java程式檔案;而二進位檔在文字編輯器中開啟則是一群無法辨識的亂碼與符號,例如:影像檔、聲音檔與圖片檔……等。
文字檔與二進位檔的比較: • 文字檔與二進位檔的差別在於讀取和寫入檔案時的轉換方式不同。 • 在Windows作業系統中,每個文字檔案都有反回(Carriage Return,簡稱CR)字元、換行(Line Feed,簡稱LF)字元與結尾(End of File,簡稱EOF)字元,其中CR的十六進位表示法為0d,LF的十六進位表示法為0a,而EOF的十六進位表示法為1a(也就是在鍵盤上按下組合鍵 + 的意思)。
在文字檔與二進位檔讀取與寫入資料的情形說明如下:在文字檔與二進位檔讀取與寫入資料的情形說明如下: • 文字檔:讀取文字檔時若遇到CR/LF字元會自動轉換成只有LF字元("\n"),若遇到十六進位1a則會自動轉換成EOF字元;而寫入資料到文字檔時會將LF字元轉換成CR/LF字元,將EOF字元轉換成十六進位1a。 • 二進位檔:二進位檔是沒有處理過的位元組資料,不會像文字檔一樣自動轉換字元,所以讀取與寫入檔案的資料完全相同。在前面曾經提過二進位檔包括影像檔、聲音檔與圖片檔……等,所以在文字編輯器中會是一堆無法辨識的亂碼。
資料流: • 資料流(Data Stream)是一系列排列好的位元組資料,在Java中以資料流來輸入與輸出檔案,會將資料流轉換成相對應的資料格式,例如:文字、圖片、聲音與影像等。 • 在Java中輸入表示從檔案中讀取資料到記憶體中(Read),而輸出剛好相反,將記憶體中的資料輸出到檔案中(Write)。
7-1.2Java的檔案處理類別 • 在Java的java.io類別庫(java.io中的類別皆繼承自java.lang.Object類別)中提供了多個子類別,可以進行檔案處理,值得注意的是,在使用這些類別前必須先以import指令載入java.io類別庫,並且處理IOException所拋出的例外情況。
下圖為java.io類別庫中較常用的檔案處理類別:下圖為java.io類別庫中較常用的檔案處理類別:
上面的類別說明如下: • File類別:處理作業系統中的檔案與資料夾,包含建立與刪除等動作。 • BufferReader/BufferWriter類別:讀取/儲存緩衝區資料,緩衝區可以暫存從外部裝置讀取的資料(例如:前面教的在程式執行結果視窗中輸入資料,就是讀取使用者輸入到緩衝區中的資料),或是要儲存到外部裝置的資料。 • FileReader/FileWriter類別:讀取/儲存文字檔案。 • FileInputStream/FileOutputStream類別:讀取/儲存文字或二進位檔案。 • RandomAccessFile類別:讀取或儲存隨機檔案。
7-2 資料夾與檔案處理 • 7-2.1 查看資料夾與檔案的資訊 • 7-2.2 處理資料夾與檔案
前言: • java.io類別庫的File類別提供了許多函式,可以對作業系統中的資料夾與檔案進行操作,以及查看資料夾與檔案的各種資訊。
7-2.1 查看資料夾與檔案的資訊 • 在Java中若要查看資料夾與檔案的資訊,必須要先建立File物件,其語法如下: • 上述語法參數的資料夾或檔案名稱若與Java程式在同一層目錄,直接撰寫資料夾或檔案名稱即可,例如:Java.txt;若是在不同目錄底下,就必須指定完整的路徑,例如:C:\\Java.txt(因為字串裡單獨的反斜線\會被視為跳脫字元,所以必須用兩個反斜線\\來分隔每一層目錄)。
下面是File類別中查看資料夾與檔案資訊的函式:下面是File類別中查看資料夾與檔案資訊的函式:
上述程式碼分析如下: • 第3行必須在main()方法的參數列後面拋出IOException例外處理。 • 第9行判斷若File物件是資料夾就執行第10~15行的程式碼,否則在第17行判斷File物件是否為檔案。 • 第12行宣告字串陣列s儲存資料夾中的清單名稱,並在第13~15行利用for迴圈逐一顯示所有資料夾與檔案的名稱。
7-2.2 處理資料夾與檔案 • 在處理資料夾與檔案前也要先建立File物件,下面是File類別中處理資料夾與檔案資訊的函式:
上述程式碼分析如下: • 第5~8行宣告四個File物件,f1~f3是檔案,f4是資料夾。 • 第9~10行判斷當ch07_02_02a.txt存在時,就修改檔名為ch07_02_02.txt。 • 第11~12行判斷當ch07_02_02b.txt存在時,就刪除該檔案。 • 第13~14行判斷當ch07_02_02資料夾存在時,就建立ch07_02_02.txt;若不存在,則建立ch07_02_02資料夾。
完成後,畫面顯示如下: : • 完成後執行程式,會發現Java程式的目錄底下的ch07_02_02a.txt改名為ch07_02_02.txt,ch07_02_02b.txt已經被刪除,並且自動建立ch07_02_02資料夾,畫面顯示如下:
7-3 文字檔的輸入與輸出 • 7-3.1 檔案處理函式 • 7-3.2 從文字檔案讀取資料—FileReader類別 • 7-3.3 將資料寫入文字檔案—FileWriter類別 • 7-3.4 逐行讀取資料—BufferedReader類別 • 7-3.5 逐行寫入資料—BufferedWriter類別
前言: • 撰寫程式時,經常需要應用文字檔的輸出入技巧,尤其要處理的資料量很多時,可以利用檔案來輸出與輸入資料,這種方式可以永久保存資料,是存取資料的重要程式技巧。
7-3.1 檔案處理函式 • java.io類別庫的Reader與Writer類別提供了許多檔案處理的函式,可以讓衍生的類別使用,分別說明如下: • 上面的函式可以應用在Reader與Writer類別衍生的BufferedReader、BufferedWriter、FileReader與FileWriter類別。
7-3.2 從文字檔案讀取資料—FileReader類別 • 利用FileReader類別讀取文字檔案的資料,必須依照下面五個步驟來撰寫程式碼。
宣告字元陣列儲存要讀取的文字資料: • 為了避免檔案中的字元數超過設定的陣列大小,可以將陣列大小設定較大的數字。
建立FileReader物件: • 建立FileReader物件時,必須指定要讀取的檔案名稱,若檔案與Java程式在同一層目錄,直接撰寫檔案名稱即可,例如:ch07_03_02.txt;若是在不同目錄底下,就必須指定完整的路徑,例如:D:\\Sample\\CH07\\ch07_03_02.txt(因為字串裡單獨的反斜線\會被視為跳脫字元,所以必須用兩個反斜線\\來分隔每一層目錄)。 • 參數"讀取的檔案名稱"可以換成File物件,會讀取File物件的檔案。
使用read函式讀取檔案的資料: • 利用read函式讀取檔案的資料並儲存到指定的字元陣列中,這裡宣告的整數是儲存讀取的資料長度。
將讀取的字元資料轉換成字串: • 建立String物件時,必須指定轉換從索引值為0到資料長度的資料,若不指定資料範圍,就會將當初宣告的陣列大小全部顯示出來(沒有資料的地方會以空白字元填滿)。
關閉檔案: • 利用close函式可以關閉檔案,關閉檔案後就不可以再讀取檔案。
上述程式碼分析如下: • 第1行必須載入java.io類別庫。 • 第3行必須在main()方法的參數列後面拋出IOException例外處理。 • 第7行建立FileReader物件,並且指定讀取的檔名為ch07_03_02.txt,若是該檔案不存在會做例外處理,拋出找不到檔案的錯誤訊息。 • 第9行利用read函式讀取ch07_03_02.txt檔案中的資料,並將該檔案中的資料長度儲存在變數len中(換行以兩個跳脫字元“\r\n”表示,佔用2個資料長度,所以變數len的值為131)。 • 第13行在檔案處理完成後,必須利用close函式關閉檔案。
7-3.3 將資料寫入文字檔案—FileWriter類別 • 利用FileWriter類別儲存文字檔案的資料,必須依照下面三個步驟來撰寫程式碼。
建立FileWriter物件: • 建立FileWriter物件時,必須指定要儲存的檔案名稱,有下面兩種方式(檔案名稱的寫法與建立FileReader物件的相同): • FileWriter 物件名稱=new FileWriter("儲存的檔案名稱");:原本檔案中的資料會被覆蓋。 • FileWriter 物件名稱=new FileWriter("儲存的檔案名稱",布林值);:若布林值為true,則會將資料附加在原本資料的後面;若布林值是false,就會預設為覆蓋原本資料。 • 參數"儲存的檔案名稱"可以換成File物件,會儲存File物件的檔案。
使用write函式將資料寫入檔案: • 要儲存的資料可以是字元、字元陣列或字串型別。
關閉檔案: • 利用close函式可以關閉檔案,關閉檔案後就不可以再儲存資料。
上述程式碼分析如下: • 第7行建立FileWriter物件,並指定儲存的檔名為ch07_03_03.txt,因為沒有設定布林值,所以若該檔案原本存在,會覆蓋原本檔案中的資料。 • 第9與11行利用write函式分別將字串s與字元陣列c寫入檔案中。 • 第13行利用close函式關閉檔案。 • 第14~20行利用FileReader物件讀取ch07_03_03.txt,並顯示出來。
7-3.4 逐行讀取資料—BufferedReader類別 • 除了利用FileReader類別來讀取文字檔案,也可以利用BufferedReader類別先建立一個緩衝區物件,然後使用readLine函式逐行讀取緩衝區的資料,這樣就不用預先宣告一個字元陣列來儲存讀取的資料了。 • 利用BufferedReader類別讀取文字檔案的資料,必須依照下面三個步驟來撰寫程式碼。
建立BufferedReader物件: • 利用一個FileReader物件當做參數來建立BufferedReader物件,同樣地,必須指定要儲存的檔案名稱(檔案名稱的寫法與建立FileReader物件的相同)。