存儲在變量,數組和對象中的數據是暫時的,當程序終止時他們就會丟失.爲了可以永java
久的保存程序中建立的數據,須要將他們存儲到硬盤或光盤的文件中.這些文件能夠移動,傳送,亦能夠被其餘程序使用.因爲數據存儲在文件中,因此咱們須要學習一個和文件有密切關係的類,叫作File類,將要掌握獲取文件的屬性以及刪除和重命名文件.最終如何向文件中寫入數據和從文件中讀取數據.linux
那麼File類關心的是在磁盤上文件的存儲.windows
File類描述的是一個文件或文件夾。(文件夾也能夠稱爲目錄)api
該類的出現是對文件系統的中的文件以及文件夾進行對象的封裝。能夠經過對象的思想來操做文件以及文件夾。數組
能夠用面向對象的處理問題,經過該對象的方法,能夠獲得文件或文件夾的信息方便了對文件與文件夾的屬性信息進行操做。ide
文件包含不少的信息:如文件名、建立修改時間、大小、可讀可寫屬性等。工具
檢驗指定路徑下是否存在指定的目錄或者文件.學習
// 檢驗指定路徑下是否存在指定的目錄或者文件.測試 File file = new File("c:\\a.txt");this System.out.println(file.exists()); // File對象是不是目錄 System.out.println(file.isDirectory()); // 對象是不是文件 System.out.println(file.isFile());
|
結論:File對象也能夠表示不存在的文件。其實表明了一個抽象路徑
構建一個File類的實例並不會在機器上建立一個文件.無論文件是否存在均可以建立任意文件名的File實例,能夠調用File實例的exists方法判斷文件或目錄是否存在
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); } |
路徑就是文件或文件夾所在的位置。
上下級文件夾之間使用分隔符分開:
在Windows中分隔符爲'\',在Unix/Linux中分隔符爲'/'。
跨平臺的目錄分隔符
更專業的作法是使用File.separatorChar,這個值就會根據系統獲得的相應的分割符。
例:new File("c:" + File.separatorChar + "a.txt");
注意,若是是使用"\",則須要進行轉義,寫爲"\\"才能夠,若是是兩個"\",則寫爲"\\\\"。
實驗:
在如下代碼的path處寫不一樣的路徑試一下,並觀察輸出結果。 File file = new File(path); System.out.println(file.getAbsolutePath()); |
對於UNIX平臺,絕對路徑名的前綴是"/"。相對路徑名沒有前綴。
對於Windows平臺,絕對路徑名的前綴由驅動器號和一個":"組成,例"c:\\..."。相對路徑沒有盤符前綴。
相對路徑:
相對路徑是指相對於某位置的路徑,是指相對於當前目錄。
在執行Java程序時,相對路徑爲執行java命令時當前所在的目錄。
實驗:
在不一樣的路徑下執行java命令運行如下程序,並觀察輸出結果。 File file = new File("a.txt"); System.out.println(file.getAbsolutePath()); 通常在使用時,建議用絕對路徑,由於相對路徑容易出問題,很差肯定到底在什麼地方。 //相對路徑 //File file = new File("src/a.txt");
|
建立:
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,列出指定目錄中全部的子文件名與全部的子目錄名。
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方法使用.