1. File類
1.1. File類說明
存儲在變量,數組和對象中的數據是暫時的,當程序終止時他們就會丟失.為了能夠永
久的保存程序中創建的數據,需要將他們存儲到硬盤或光盤的文件中.這些文件可以移動,傳送,亦可以被其他程序使用.由於數據存儲在文件中,所以我們需要學習一個和文件有密切關系的類,叫做File類,將要掌握獲取文件的屬性以及刪除和重命名文件.最終如何向文件中寫入數據和從文件中讀取數據.
那么File類關心的是在磁盤上文件的存儲.
File類描述的是一個文件或文件夾。(文件夾也可以稱為目錄)
該類的出現是對文件系統的中的文件以及文件夾進行對象的封裝。可以通過對象的思想來操作文件以及文件夾。
可以用面向對象的處理問題,通過該對象的方法,可以得到文件或文件夾的信息方便了對文件與文件夾的屬性信息進行操作。
文件包含很多的信息:如文件名、創建修改時間、大小、可讀可寫屬性等。
1.2. 體驗File類
檢驗指定路徑下是否存在指定的目錄或者文件.
// 檢驗指定路徑下是否存在指定的目錄或者文件. File file = new File("c:\\a.txt"); System.out.println(file.exists()); // File對象是否是目錄 System.out.println(file.isDirectory()); // 對象是否是文件 System.out.println(file.isFile());
|
結論:File對象也可以表示不存在的文件。其實代表了一個抽象路徑
構建一個File類的實例並不會在機器上創建一個文件.不管文件是否存在都可以創建任意文件名的File實例,可以調用File實例的exists方法判斷文件或目錄是否存在
1.3. 構造一個File類實例:
new File(String pathname); 通過將給定路徑來創建一個新File實例。 new File(String parent, String child); 根據parent路徑名字符串和child路徑名創建一個新File實例。 parent是指上級目錄的路徑,完整的路徑為parent+child. new File(File parent, String child); 根據parent抽象路徑名和child路徑名創建一個新File實例。 parent是指上級目錄的路徑,完整的路徑為parent.getPath()+child. 說明: 如果指定的路徑不存在(沒有這個文件或是文件夾),不會拋異常,這時file.exists()返回false。 |
新建File對象File file=new File();
public static void main(String[] args) { File file = new File(); } |
1:創建File對象需要導包, import java.io.File
2:File對象沒有無參數構造.創建對象需要傳參.
根據API文檔提示,傳入一個文件的字符串路徑. String path="c:/a.txt";
(a.txt 文件在c盤下已經存在)
//file 是一個文件對象 String path = "c:/a.txt"; File file = new File(path); |
File類的對象,既可以代表文件也可以代表文件夾。
public static void main(String[] args) { //file 是一個文件夾 String path = "c:/test"; File file = new File(path); } |
1.4. 路徑:
路徑就是文件或文件夾所在的位置。
1.4.1. 路徑分割符:
上下級文件夾之間使用分隔符分開:
在Windows中分隔符為'\',在Unix/Linux中分隔符為'/'。
跨平台的目錄分隔符
更專業的做法是使用File.separatorChar,這個值就會根據系統得到的相應的分割符。
例:new File("c:" + File.separatorChar + "a.txt");
注意,如果是使用"\",則需要進行轉義,寫為"\\"才可以,如果是兩個"\",則寫為"\\\\"。
實驗:
在以下代碼的path處寫不同的路徑試一下,並觀察輸出結果。 File file = new File(path); System.out.println(file.getAbsolutePath()); |
1.4.2. 絕對路徑與相對路徑:
對於UNIX平台,絕對路徑名的前綴是"/"。相對路徑名沒有前綴。
對於Windows平台,絕對路徑名的前綴由驅動器號和一個":"組成,例"c:\\..."。相對路徑沒有盤符前綴。
相對路徑:
相對路徑是指相對於某位置的路徑,是指相對於當前目錄。
在執行Java程序時,相對路徑為執行java命令時當前所在的目錄。
實驗:
在不同的路徑下執行java命令運行以下程序,並觀察輸出結果。 File file = new File("a.txt"); System.out.println(file.getAbsolutePath()); 一般在使用時,建議用絕對路徑,因為相對路徑容易出問題,不好確定到底在什么地方。 //相對路徑 //File file = new File("src/a.txt");
|
1.5. File類中常用的方法:
創建:
createNewFile() 在指定位置創建一個空文件,成功就返回true,如果已存在就不創建然后返回false mkdir() 在指定位置創建目錄,這只會創建最后一級目錄,如果上級目錄不存在就拋異常。 mkdirs() 在指定位置創建目錄,這會創建路徑中所有不存在的目錄。 renameTo(File dest) 重命名文件或文件夾,也可以操作非空的文件夾,文件不同時相當於文件的剪切,剪切時候不能操作非空的文件夾。移動/重命名成功則返回true,失敗則返回false。 |
刪除:
delete() 刪除文件或一個空文件夾,如果是文件夾且不為空,則不能刪除,成功返回true,失敗返回false。 deleteOnExit() 在虛擬機終止時,請求刪除此抽象路徑名表示的文件或目錄,保證程序異常時創建的臨時文件也可以被刪除 |
判斷:
exists() 文件或文件夾是否存在。 isFile() 是否是一個文件,如果不存在,則始終為false。 isDirectory() 是否是一個目錄,如果不存在,則始終為false。 isHidden() 是否是一個隱藏的文件或是否是隱藏的目錄。 isAbsolute() 測試此抽象路徑名是否為絕對路徑名。 |
獲取:
getName() 獲取文件或文件夾的名稱,不包含上級路徑。 getPath() 返回絕對路徑,可以是相對路徑,但是目錄要指定 getAbsolutePath() 獲取文件的絕對路徑,與文件是否存在沒關系 length() 獲取文件的大小(字節數),如果文件不存在則返回0L,如果是文件夾也返回0L。 getParent() 返回此抽象路徑名父目錄的路徑名字符串;如果此路徑名沒有指定父目錄,則返回null。 lastModified() 獲取最后一次被修改的時間。 文件夾相關: staic File[] listRoots() 列出所有的根目錄(Window中就是所有系統的盤符) list() 返回目錄下的文件或者目錄名,包含隱藏文件。對於文件這樣操作會返回null。 list(FilenameFilter filter) 返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操作會返回null。 listFiles() 返回目錄下的文件或者目錄對象(File類實例),包含隱藏文件。對於文件這樣操作會返回null。 listFiles(FilenameFilter filter) 返回指定當前目錄中符合過濾條件的子文件或子目錄。對於文件這樣操作會返回null。 |
1.6. 案例:
1,列出指定目錄中所有的子文件名與所有的子目錄名。
2,列出指定目錄中所有的子文件名與所有的子目錄名,要求目錄名與文件名分開列出,格式如下:
子目錄:
...
...
子文件:
...
...
3,列出指定目錄中所有擴展名為.java的文件。
4,列出指定目錄中所有擴展名為.class的文件。
5,思考第3與第4題,代碼是不是重復呢,如果想要列出其中的所有.txt文件,是不是要再寫一個類呢?
a, 請自行設計一個工具方法,可以傳遞指定的擴展名,工具方法會過列出指定目錄中指定擴展名的所有子文件與子文件夾。
b, 請利用FilenameFilter接口寫一個工具類,可以傳遞指定的過濾規則。
6,列出指定目錄中所有的子孫文件與子孫目錄名,只需要列出名稱即可。
解題: 列出指定目錄中所有的子文件名與所有的子目錄名。
需求1:獲取所有的c:/test 即test目錄下的所有文件和文件夾 解題思路: 代碼需要封裝,就需要創建方法,並在main方法中調用和測試. 方法名要有意義: listAllFilesAndDirs 第一步:創建File對象 第二步:查找File類中可用的方法,想要獲取該目錄下的所有子文件和子目錄 第三步:顯示這些文件和文件夾的名稱 |
實現:
/** * 列出指定目錄中所有包含的子文件與子目錄 */ public static void listAllFilesAndDirs(String path) { // 1.創建File對象,表示這個目錄 File dir = new File(path); // 2.通過list方法得到所包含的所有子目錄與子文件名稱 String[] names = dir.list(); // 3顯示這些名稱 for (int i = 0; i < names.length; i++) { System.out.println(names[i]); } } |
解題: 列出指定目錄中所有的子文件名與所有的子目錄名,要求目錄名與文件名分開列出
案例1把文件和文件夾都列了出來,但是無法區分文件和文件夾.File類有判斷文件和文件夾的方法,但是list方法返回的是String數組,這個list() 方法無法滿足我們的需求.繼續查找File的方法.查看api找到 File[] listFiles() 發現該方法返回的是一個File數組。
思路: 第一步:創建listAllFilesAndDirs(String path)方法,接受路徑 第二步: 創建File對象表示這個目錄 第三步: 通過listFiles方法得到所包含的所有子目錄與子文件名稱 第四步: 得到所有的文件名集合,與所有的文件夾名集合 第五步: 分別顯示文件名與文件夾名 |
實現
public static void listAllFilesAndDirs2(String path) { // 1.創建File對象,表示這個目錄 File dir = new File(path); // 2通過listFiles方法得到所包含的所有子目錄與子文件名稱 File[] names = dir.listFiles(); // 3,分別顯示文件名與文件夾名 for (int i = 0; i < names.length; i++) { File file = names[i]; if (file.isFile()) { System.out.println(("子文件:")); System.out.println("\t" + file.getName()); } else if (file.isDirectory()) { System.out.println(("子目錄:")); System.out.println("\t" + file.getName()); } } } |
實現二:
public static void listAllFilesAndDirs(String path) { //1創建File對象表示這個目錄 File dir = new File(path);
//2通過listFiles方法得到所包含的所有子目錄與子文件名稱 File[] names = dir.listFiles();
//3,得到所有的文件名集合,與所有的文件夾名集合 List<File> filesList = new ArrayList<File>(); List<File> dirsList = new ArrayList<File>(); for (int i = 0; i < names.length; i++) { File file = names[i]; if (file.isFile()) { filesList.add(file); } else if (file.isDirectory()) { dirsList.add(file); } }
//4,分別顯示文件名與文件夾名 System.out.println("子文件:"); for (int i = 0; i < filesList.size(); i++) { System.out.println("\t" + filesList.get(i).getName()); } System.out.println("子目錄:"); for (int i = 0; i < dirsList.size(); i++) { System.out.println("\t" + dirsList.get(i).getName()); } } |
練習3,列出指定目錄中所有擴展名為.java的文件。
需求: 從指定目錄中找到指定擴展名的文件,並列出來 思路 第一步: 創建lsitAllFiles方法,接受路徑和文件后綴名 第二步: 獲取所有的子文件和子文件夾 第三步: 從中找出符合條件的文件並顯示出來
|
注意:不同系統對於路徑的 windows系統使用斜線作為路徑分隔符 "\" linux 系統使用反斜線作為路徑分隔符"/"java是跨平台的語言,java程序如果部署到linux系統上,如果程序中有File對象, 可以使用File類separatorChar (字段)
public class FileTest2 { public static void main(String[] args) { String path = "c:" + File.separatorChar + "test"; File file = new File(path); listtAllFiles(file, "java"); }
/** * 從指定目錄中找到指定擴展名的文件,並列出來 * */ public static void listtAllFiles(File dir, String extension) { // 1.獲取所有的子文件和子文件夾 File[] files = dir.listFiles();
// 2.從中找出符合條件的文件並顯示出來 for (int i = 0; i < files.length; i++) { File file = files[i]; // 3.需要以指定文件后綴結尾才算符合條件 if (file.getName().endsWith(extension)) { System.out.println(file.getName()); } } } }
|
練習4:
public class FileTest2 { public static void main(String[] args) { String path = "c:" + File.separatorChar + "test"; File file = new File(path); listtAllFiles2(file, "txt"); }
/** * FilenameFilter接口寫一個工具類,可以傳遞指定的過濾規則。 * 從指定目錄中找到指定擴展名的文件,並列出來 * * */ public static void listtAllFiles2(File dir, String name) { // 1.獲取所有的子文件和子文件夾 String[] files = dir.list(new DirFilter("txt"));
// 2顯示名稱 for (int i = 0; i < files.length; i++) { System.out.println(files[i]); } } }
class DirFilter implements FilenameFilter { private String extension;
public DirFilter() {
}
public DirFilter(String extension) { this.extension = extension; }
@Override public boolean accept(File dir, String name) { return name.endsWith(extension); } } |
注意: DirFilter 就是實現了accept 方法.提供給File類的list方法使用.