###### tags: `Java` `檔案` # Java自學紀錄 - 檔案 ## 檔案屬性 先介紹**java.io.File**這個類別,他可以查看檔案是否存在、可讀取、可寫入、檔案長度、顯示檔案內容,**File**類別存在於**java.io**套件中,使用前先匯入此套件。 ```java= import java.io.File; 或是 import java.io.*; ``` 請先設定檔案路徑和名稱 若不設定路徑,則預設於專案所在路徑 ```java= File filename = new File(檔案路徑,檔案名稱); ``` ### File的建構子 請先在你要的路徑中新增test文字檔 ```java= import java.io.File; public class Java_12_file { public static void main(String[] args) { String route,name; route = "d:/java/File"; name = "test.txt"; File dir = new File(route); File filename = new File(route,name); System.out.println("檔案名稱 : "+name); System.out.println("檔案是否存在 : "+filename.exists()); System.out.println("檔案所資料夾 : "+filename.getParent());//取得file路徑 System.out.println("是否為資料夾 : "+filename.isDirectory()); System.out.println("是否為檔案 : "+filename.isFile()); System.out.println("可讀取 : "+filename.canRead());//是否可讀取 System.out.println("可寫入 : "+filename.canWrite());//是否可寫入 System.out.println("可執行 : "+filename.canExecute());//是否可執行 System.out.println("檔案大小 : "+filename.length());//檔案長度 } } ``` >輸出內容 ``` 檔案名稱 : test.txt 檔案是否存在 : true 檔案所資料夾 : d:\java 是否為資料夾 : false 是否為檔案 : true 可讀取 : true 可寫入 : true 可執行 : true 檔案大小 : 17 ``` ### list() list()可以列出該路徑的所有檔案或資料夾。 例題1 : 判斷該路徑下的資料為檔案或資料夾。 ```java= import java.io.*; public class Java_12_1_file { public static void main(String[] args) { String route; route = "d:/java/File"; File tmp = new File(route); String s[] = tmp.list(); //把該路徑的所有資料夾和檔案輸入s陣列中 System.out.println("檔案路徑 : "+route); System.out.println("此路徑有"+s.length+"個資料"); for(int i=0;i<s.length;i++){ File site = new File(route+"/"+s[i]); if(site.isDirectory()){ System.out.println(s[i]+" is a Directory"); } else if(site.isFile()){ System.out.println(s[i]+" is a File"); } } } } ``` >輸出結果 ``` 檔案路徑 : d:/java/File 此路徑有4個資料 File1 is a Directory File2 is a Directory File3 is a Directory test.txt is a File ``` ### FilenameFilter 若要過濾檔案,則要用FilenameFliter介面。 承例題1:過濾出(*.txt)檔,並輸出他是檔案或資料夾。 使用FilenameFilter,要用accpet方法,並把他們放在同一個package >**accept 方法** ```java= package learning.FilenameFilter; import java.io.File; import java.io.FilenameFilter; public class aa implements FilenameFilter { String ext; public aa(String ext) { this.ext = "." + ext; } public boolean accept(File dir, String name) { return name.endsWith(ext); } } ``` >主程式如下 ```java= package learning.FilenameFilter; import java.io.File; import java.io.FilenameFilter; public class Java_12_2_file { public static void main(String[] args) { String route; route = "d:/java/File"; File pathname = new File(route); aa only = new aa("txt"); //過濾txt檔 String s[] = pathname.list(only); for(int i=0;i<s.length;i++){ File site = new File(route+"/"+s[i]); if(site.isDirectory()){ System.out.println(s[i]+" is a Directory"); } else if(site.isFile()){ System.out.println(s[i]+" is a File"); } } } } ``` >輸出結果 ``` test.txt is a File ``` ---- ## 文字檔寫入 ### FileOutputStream 類別 #### 建構子 ```java= import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; public class Java_12_2_file { public static void main(String[] args) throws FileNotFoundException { //在該路徑建立test1.txt FileOutputStream f1 = new FileOutputStream("d:/java/File/test1.txt"); } } ``` >在電腦打開該路徑可看到新增了一個"test1"的*.txt檔 ![](https://i.imgur.com/GdbK6lD.png) #### 方法 ```java= import java.io.FileOutputStream; import java.io.IOException; public class Java_12_2_file { public static void main(String[] args) throws IOException { //在該路徑建立test1.txt FileOutputStream f1 = new FileOutputStream("d:/java/File/test1.txt"); //write方法的型別為byte[]陣列,以下敘述為寫入A~Z for(int i=0;i<26;i++){ f1.write(65+i); } } } ``` >顯示結果 ![](https://i.imgur.com/PqvF1za.png) ### DataOutputStream 類別 * void writeBytes(String s) 可以將字串寫入檔案 ```java= import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.IOException; public class Java_12_2_dataoutputstream { public static void main(String[] args) throws IOException { FileOutputStream filename = new FileOutputStream("d:/java/File/test2.txt"); DataOutputStream data = new DataOutputStream(filename); String s = "Lucas is handsome"; data.writeBytes(s); //將字串寫入test2.txt } } ``` >顯示結果 ![](https://i.imgur.com/6jbPphG.png) ---- ## 文字檔輸出 和檔案的寫入剛好相反,他是讀取資料內容並將其輸出。 ### FileInputStream 類別 * FileInputStream(File file) 先於test3.txt中寫入"ABCDE" ```java= import java.io.FileInputStream; import java.io.IOException; public class Java_12_2_fileinputstream { public static void main(String[] args) throws IOException { byte b[] = new byte[10]; FileInputStream file = new FileInputStream("d:/java/File/test3.txt"); //int a = file.read(); //這樣只會讀入第一個位元(byte) //System.out.println(a); //得到的是ASCII碼 //System.out.println((char)a); int length = file.read(b); for(int i=0;i<length;i++){ System.out.print((char)b[i]); //將ASCII轉Char } } } ``` >輸出結果 ``` ABCDE ``` ### FileReader和BufferedReader 類別 前面提及的FileInputStream與DataoutputStream並無法處理中文,若要處裡中文的話必須使用FileReader或BufferedReader。 * String readLine() 可讀取串流中的一列字串,字串的分隔為"\n","\r"。 ```java= import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class Java_12_2_filereader { public static void main(String[] args) throws IOException { FileReader file = new FileReader("d:/java/File/test3.txt"); BufferedReader b = new BufferedReader(file); //將檔案內容存在buffer緩衝區 String s; s = b.readLine(); System.out.println(s); } } ```