• 沒有找到結果。

File 類別 (1)

在 JAVA 中,檔案的讀、寫、在螢幕上顯示訊息、記憶體的存取,或是網路資源的使 用等動作,都被視為「串流(Stream)」。「串流」可以被視為資料輸出、輸入的通道 JAVA 將處理串流資料的相關類別放於「java.io」套件之中,需事先引用這個套件 在實際探討串流資料處理之前,我們先來了解「File」類別。嚴格說來,它並不屬於 串流的類別,因為該類別中的方法並不會牽涉到檔案的讀寫,但該類別會被用來提供 檔案或是目錄的相關資訊,包括了檔案的建立,大小、修改日期、存取權限等資訊…

等等。File類別包含了三種型態的建構子:

建構子 作 用

File(String pathname, String filename) 以上層的路徑名稱parent,並以「filename」字串的內容為 檔案名稱,建立新的File物件

File(String pathname) 將「pathname」的內容轉換為絕對路徑,並在該路徑下建

立新的File物件

File(Object parent, String child) 以上層的路徑物件parent,以「child」字串的內容為子目

錄的路徑或名稱,建立新的File物件

在目前的目錄下建立一個參考到「test.txt」檔案的File物件:

File 類別 (2)

File f1 = new File("test.txt");

File類別也可以用來處理目錄,例如:

File f2 = new File("c:\\TestDir");

如果是在Windows系統下,該程式碼會產生一個指向「c:\TestDir」目錄的物件。會使用 到「\\」是因為在Windows系統下的目錄符號「\」剛好是Java中跳脫字元的前置符號,

所以使用了「\\」來代替實際的「\」符號。當然,如果你是要在Linux平台下執行Java程 式,那目錄符號要更改為「/」

你也可以直接參考到指定目錄下的檔案,例如在windows系統下以下的兩行程式都會參 考到「c:\TestDir\test.txt」檔案:

File f3 = new File("c:\\TestDir\\test.txt");

File f4 = new File("c:\\TestDir","test.txt");

或者產生一個參考到目錄的 File 物件,再利用該物件參考到檔案,例如:

File f5 = new File("c:\\TestDir");

File f6 = new File( f5, "test.txt");

File類別的方法 (1)

File類別也提供相當多的方法來處理檔案或是目錄,有些方法單用於目錄或是檔案,有 些方法則是可以共用,請參考下表:

方 法 作 用

boolean canRead() 判斷是否可以根據提供的路徑讀取指定的檔案。如果可以,

則傳回true,如果不可以,則傳回false。

boolean canWrite() 判斷是否可以根據提供的路徑寫檔。如果可以,則傳回ture,

如果不可以,則傳回false。

boolean exists() 判斷指定的路徑下是否有指定的檔案

File getAbsoluteFile() 根據File物件參考的內容,取得指定的檔案參考

String getAbsolutePath() 根據File物件參考的內容,取得檔案的絕對路徑

String getName() 根據File物件參考的內容,取得目錄或是檔案的名稱,但不會

包含路徑

String getParent() 根據File物件參考的內容,取得上一層的路徑名稱

boolean isDirectory() 根據File物件參考的內容,判斷是否為目錄

boolean isFile() 根據File物件參考的內容,判斷是否為檔案

long lastModified() 根據File物件參考的內容,取得該檔案最後被修改的日期,傳

回毫秒值,並以1970年一月一日零時為計算基準,如果傳回 OL,代表該檔案不存在

long length() 根據File物件參考的內容,取得檔案的長度

File[] listFiles() 根據File物件參考的內容,取得該路徑下所有的檔案名稱

boolean renameTo(File dest) 將File物件參考的內容更改為指定的dest名稱

通常我們會先用isFile方法來判斷物件是否為檔案,再利用相關的方法來操作其他的需求:

File類別的方法 (2)

程式10-2:Chap 10\File 2.java 01: import java.io.File;

02: import java.util.Date;

03:

04: class File2{

05: public static void main(String[] args) {

06: File f = new File("c:\\Work\\Chap10\\Test.java");

07: System.out.println("f物件是否存在:"+ f.exists());

08: System.out.println("f物件是否為檔案:"+ f.isFile());

09: System.out.println("f物件是否可以讀取:"+ f.canRead());

10: System.out.println("f物件是否可以寫入:"+ f.canWrite());

11: System.out.println("f物件的實際名稱為:"+ f.getName());

12: System.out.println("f物件的修改日期為:"+ new Date(f.1astModified());

13: System.out.println("f物件的實際大小為:"+ f.length() +"Bytes");

14: System.out.println("f物件的絕對路徑為:"+ f.getAbsolutePath());

15: System.out.println("f物件的路徑為:"+ f.getParent());

16: } 17: }

程式的執行結果為: f物件是否存在:true

f物件是否為檔案:true f物件是否可以讀取:true f物件是否可以寫入:true f物件的實際名稱為:Test.java

File類別的方法 (3)

用 java 模擬 Windows 的 dir 指令,或 Unix 的 ls 指令:

程式10-3:Chap 10\File 3.java 01: import java.io.File;

02:

03:

04: class File3{

05: public static void main(String[] args) { 06: File f = new File("C:\\java\\");

07: File[] lists = f.listFiles();

08: int i ; 09:

10: for (i = 0 ; i<lists.legngth-1 ; i++) ; 11: if (lists[i].isDirectory()) {

12: System.out.println("<Dir>\t");

13: } else {

14: System.out.println(lists[i].getName()+"\t"+lists[i].length()+"Bytes");

15: } 16: } 17: } 18: }

執行的結果類似:

File1 .class 680 Bytes File1 .java 319 Bytes

import java.io.*;

public class FileRename {

public static void main(String[] args) {

File fs = new File(args[0]);

File fd = new File(args[1]);

if (fs.exists()) {

if (!fd.exists()) {

if (fs.renameTo(fd)) {

System.out.println(fs.getName() + " 已改名為 " + fd.getName());

System.out.println("1 file(s) has been renamed!");

} } }

File類別的方法 (4)

更改檔名:

字元串流的處理

 JAVA 的緩衝處理

◦ 緩衝資料流(Buffered Stream)

◦ 藉由一塊記憶體緩衝區來連結I/O資料流,

並讓資料的操作能夠增加效能

 相關類別

◦ InputStreamReader

◦ BufferedReader

BufferedReader (1)

我們也可以使用BufferedReader來儲存自鍵盤輸入的資料,藉由該類別中的readLine方法 可以一次讀取整行的資料,請參考以下的範例:

程式10-8:Chap 10\ InputStreamReader 2.java 01: import java.io.*;

02:

03: public class InputStreamReader 2 { 04: public static void main(String[] args) {

05: InputStreamReader ir = new InputStreamReader(System.in);

06: BufferedReader br = new BufferedReader(ir);

07: float salary;

08:

09: try{

10: System.out.print("請輸入月薪:");

11: salary = Float.parseFloat(br.readLine());

12: System.out.print("你的年薪是:"+salary*12);

13: } catch (IOException e) {

14: System.out.println(e.toString());

15: } catch (Exception e) {

16: System.out.println(e.toString());

17: }

程式的執行結果為:

請輸入月薪:35 你的年薪是:420.0

程式的第6行將InputStreamReader物件轉為BufferedReader物件,而在程式的第11行則使 用readLine方法來讀取輸入的整行資料。由於讀入的資料是String型態的資料,所以,

再使用「Float.parseFloat()」方法來將資料轉為float型態

BufferedReader (2)

課堂練習 PT82

串流練習 (PT82.java):

以 InputStreamReader 寫一個程式可以分別詢問使用 者他的:

◦ 名字

◦ 年齡

◦ 性別

輸入完後再將結果印在畫面:

Hi 名字 (先生/小姐) 你好,你今年 年齡 歲

讀寫檔案

 JAVA 中讀寫檔案的方法有許多種

 在此介紹英文與中日韓文語系中最常使 用的兩種類別工具:

◦ 英文讀寫:

 DataInputStream / DataOutputStream

◦ 中日韓文讀寫:

 FileReader / FileWriter

Input/Output Stream

DataInputStream和DataOutputStream類別是 位元資料處理的串接類別。

DataInputStream與DataOutputStream須藉由FileInputStream與 FileOutputStream對檔案做存取

假設有一檔案 file1.txt 內容為:

DataInputStream

以下的範例示範如何使用DataInputStream類別,並讀取「file1.txt」檔案中的資料:

程式10-14:Chap 10\ DataInputStream1.java import java.io.*;

class DataInputStream1 {

public static void main(String[] args) throws IOException {

FileInputStream fis = new FileInputStream("file1.txt");

DataInputStream dis = new DataInputStream(fis);

int i;

while((i = dis.read()) != -1) {

System.out.print((char) i);

}

dis.close();

fis.close();

} }

程式的執行結果為: You will always on my mind.

DataOutputStream

以下的範例示範如何使用DataOutputStream類別,並將資料寫入「File2.txt」檔案中:

程式10-15:Chap 10\ DataOutputStream 1.java 01: import java.io.*;

02:

03: public class DataOutputStream 1 {

04: public static void main (String[] args) throws IOException { 05: FileOutputStream fos = new FileOutputStream("file2.txt");

06: DataOutputStream dos = new DataOutputStream(fos);

07:

08: byte[] c = {'J', 'a', 'v', 'a'};

09: dos.write( c);

10:

11: fos.close();

12: dos.close();

13: } 14: }

範例程式的第5行建構出一個FileOutputStream物件,並將此物件傳給DataOutputStream 物件。程式的第9行使用「write()」方法將資料寫入「File2.txt」檔案中

FileReader/FileWrite類別

不論是FileInputStream、FileOutputStream、DataInputSteam、DataOutputStream類別,它 們都是針對位元組資料所設計的類別。對於亞洲體系的文字,由於使用的是雙位元的資 料,這些類別並無法很完善的處理這些類型的資料。如果要處理雙位元的資料,我們必 需使用FileReader、BufferedReader、FileWrite、BufferedWriter等類別。處理方式請參考 下圖:

File 類別

File 類別

FileReader 類別

以下的範例示範如何使用FileReader類別,並讀取「file1.txt」檔案中的資料:

程式10-16:Chap 10\ FileReader1.java 01: import java.io.*;

02:

03: public class FileReader1 {

04: public static void main (String[] args) throws IOException { 05: File f = new File("file1.txt");

06: FileReader fr = new FileReader(f);

07: int i;

08:

09: while((i = fr.read()) !=-1) { 10:

11: System.out.print((char) i);

12: }

13: fr.close();

14: } 15: }

程式執行的結果為:

You will always on my mind.

北風傳來了熟悉的聲音

FileWriter 類別

以下的範例示範如何使用FileWrite類別,並將字串寫入「file3.txt」檔案中的資料:

程式10-17:Chap 10\ FileWriter 1.java 01: import java.io.*;

02:

03: public class FileWriter 1 {

04: public static void main (String[] args) throws IOException { 05: File f = new File("file3.txt");

06: FileWriter fw = new FileWriter(f);

07:

08: String str = "Java is easy to learn.\n";

10:

11: fw.write(str);

12: fw.close();

13: } 14: }

檔案輸出入練習 (PT83.java):

假定某位學生的紀錄如下:

姓名:name,字串型態,值為「Alex」

數學成績:mathRecord,int型態,值為「95」

國文成績:chnRecord,int型態,值為「90」

英文成績:engRecord,int型態,值為「94」

請建構串流物件out,並將該筆記錄寫入「record.txt」檔 案中,再將「record.txt」檔案的內容讀出,並顯示在螢 幕上

課堂練習 PT83

相關文件