###### 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檔

#### 方法
```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);
}
}
}
```
>顯示結果

### 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
}
}
```
>顯示結果

----
## 文字檔輸出
和檔案的寫入剛好相反,他是讀取資料內容並將其輸出。
### 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);
}
}
```