#Java教程:File類:檔案、目錄的建立、刪除、判斷、getXXX、canXXX @FDDLC
一、File類的作用:
原始碼中的簡介:
意思是說:File類是檔案或目錄的抽象表示。
也就是說,File可以表示一個檔案,也可以表示一個目錄。那何為抽象呢?File不等同於真實的檔案或資料夾,只是封裝了一些對它們的操作而已。
二、建立一個File物件
1、方法:
程式碼:
import java.io.File;
class Solution{
public static void main(String[] args) {
File file=new File("a.txt"); //不一定是檔案
File file2=new File("dir"); //不一定是目錄
}
}
2、上面使用了相對路徑,我不知道這個相對路徑相對的是誰(不妨稱之為ContextPath),當然也不知道ContextPath下究竟有沒有a.txt或dir!
那麼,如何獲取這個ContextPath呢?
可以這樣做:
package cn.edu.nenu;
import java.io.File;
class Main{
public static void main(String[] args) {
File file=new File(""); //必須要有引數,不能空著!
System.out.println("file.getAbsolutePath():"+file.getAbsolutePath());
System.out.println("file.getAbsoluteFile():"+file.getAbsoluteFile());
}
}
仔細分析可知,這個ContextPath跟包沒有關係,其實就是專案的根目錄!
這個結論很重要!如果要使用相對路徑的話,連相對誰都不知道是很麻煩的~
3、在【1】中,我們建立了一個File類,這玩意兒只是個抽象的東西。如何建立一個真實的檔案(比如a.txt,可以編輯的那種)或資料夾(比如test資料夾,可以點開進入那種)呢?
程式碼:
package cn.edu.nenu;
import java.io.File;
import java.io.IOException;
class Main{
public static void main(String[] args) throws IOException {
File file=new File("dir"); //像一個目錄?我要用此物件建立一個檔案!
File dir=new File("a.txt"); //像一個檔案?我用此物件建立一個資料夾!
File multiDirs=new File("a\\b\\c");
System.out.println("file.createNewFile():"+file.createNewFile()); //true表示建立成功
System.out.println("dir.mkdir():"+dir.mkdir()); //只能建立最後一級目錄,若有多級目錄不存在,則建立失敗
System.out.println("multiDirs.mkdir():"+multiDirs.mkdir()); //有多級目錄不存在,建立失敗
}
}
執行前:
執行後:
從上面的結果可以看出:
1)a.txt是一個資料夾
原因:對應的File物件使用的是createNewFile方法,即建立一個新的檔案,所以結果是一個檔案!
2)dir是一個檔案
原因:對應的File物件使用的是mkDir方法,即建立一個新目錄,所以結果是一個目錄!
3)並沒有建立a\b\c這個多級目錄,因為對應的物件使用的是mkDir,mkDir只能建立最後一級目錄,最後一級目錄前面的所有目錄都必須存在才能建立成功。這裡最後一級目錄是c,它上級還有b,b上面還有目錄c,b和c都必須存在才能c才能建立成功!
要想建立多級不存在的目錄,可以使用mkDirs!s結尾,複數!
4)Windows系統中路徑分隔符是'\',而'\'是Java中的轉義標誌符,'\\'才表示'\'
三、建立File類的多種方法(構造方法的多種過載形式)
1、public File(String pathname)
補充:
path又是什麼呢?請看:
測試一下這個path唄:
File file=new File("a.txt"); //不一定是檔案
File prefixFile=new File("dir1\\dir2\\a.txt");
File absoluteFile=new File("D:\\test\\dir");
System.out.println(file.getPath());
System.out.println(prefixFile.getPath());
System.out.println(absoluteFile.getPath());
你建立File類時給的是啥(格式正確),這個path就是啥!如果格式不正解,會被糾正,比如:
File prefixFile=new File("dir1\\dir2\\//a.txt"); 輸出(被糾正了):dir1\dir2\a.txt
那麼這個prefixLength呢?請看:
先確定getName的作用:returns the name of the file or directory denoted by this abstract pathname.
意思是說getName用於獲取檔案或目錄的名字!
再回到prefixLength上來。結合getName的原始碼來分析一下:
假如String型別的path為"one\two\three":
separatorChar是'\',lastIndexOf匹配的是最後一個'\':"one\two\three"。因此index應該等於7,除錯得知prefixLength為0,,然後返回path.substring(7+1),即從8到最後,為three!
如果path為"one",prefixLength也為0(沒有字首),path.lastIndexOf('\')為-1(找不到),於是返回substring(0),即0到最後,為one!
如果path為"\one",除錯得知prefixLength為1;如果path為"\one\two",除錯得知prefixLength也為1
如果path為"C:\abcd",除錯得知prefixLength為3。
如果是碟符開頭,則字首長度為3(C:\,D:\等);如果是以\開頭,則字首長度為1;如果是相對路徑,則字首長度為0。
最後驗證這個結論:
從上面這個說明來看,大體是不差的,補充一個案例:
(\\one\two的prefixLength為2)
2、public File(String parent, String child)
示例:
System.out.println(new File("a\\b\\","c\\d").getPath());
System.out.println(new File("a\\b","\\c\\d").getPath());
System.out.println(new File("a\\b\\","\\c\\d").getPath());
總結:不用糾正在父路徑後面要不要加\
3、public File(File parent, String child)
示例:
System.out.println(new File(new File("a\\b"),"\\c\\d"));
四、檔案或目錄的建立與刪除:createNew、mkdir、mkdirs,建立成功返回true,否則返回false!delete:刪除成功返回true!
1、建立檔案:
File file=new File("a.txt");
System.out.println(file.createNewFile());
說明:
1)如果存在同名檔案,則建立失敗;
2)如果存在同名資料夾(a.txt),也會建立失敗;
3)如果路徑中包含不存在的目錄,會丟擲異常:比如 File file=new File("one\\a.txt"); 因為one這個目錄不存在丟擲了異常!
4)沒有資料夾的訪問許可權也會建立失敗;
5)當然也可以使用絕對路徑,規則同上
2、建立單級目錄:
System.out.println(new File("one\\a.txt").mkdir());
上面建立失敗,因為one這個目錄不存在,但不會丟擲異常。像這種有多級目錄不存在的情況,可以使用mkdirs
System.out.println(new File("a.txt").mkdir());
上面建立失敗,因為如果存在同名目錄,或者同名檔案(不是目錄),也會建立失敗。
3、建立多級目錄:
System.out.println(new File("a\\b\\").mkdirs());
System.out.println(new File("c\\d").mkdirs());
結果:兩個都建立成功(注:執行前a、b、c、d這4個目錄都不存在)
4、刪除:
System.out.println(new File("file").delete()); //存在file這個檔案,刪除成功!
System.out.println(new File("dir").delete()); //存在dir這個目錄,刪除成功!
System.out.println(new File("none").delete()); //不存在,刪除失敗!
五、get方法
1、getName:檔案返回檔名,目錄返回目錄名
2、getParent:返回path最後一個\前面的內容
File file = new File("D:\\document\\IDEA\\ACM"); //所有目錄都存在
System.out.println(file.getParent());
File file2=new File("a\\b\\c"); //所有目錄都存在
System.out.println(file2.getParent());
File file3=new File("a\\none\\none2"); //none、none2都不存在
System.out.println(file3.getParent());
System.out.println(new File("a").getParent()); //a存在
System.out.println(new File("C:\\abcd\\efg").getParent());
結果:
getParent的原始碼:
3、getPath:返回路程值,比如:C:\one\two,a\b\c,a,都是可以的(驗證過)。其實返回的就是:
時的那個pathname!
System.out.println(new File("C:\\one\\two").getPath());
System.out.println(new File("a\\b\\c").getPath());
System.out.println(new File("a").getPath());
4、public String getAbsolutePath():返回絕對路徑
//如果是絕對路徑,直接返回;如果是相對路徑,用其path值拼在ContextPath後面
System.out.println(new File("a\\b").getAbsolutePath());
System.out.println(new File("\\a\\b").getAbsolutePath()); //認為此路徑是絕對路徑,加上碟符返回!
System.out.println(new File("C:\\none").getAbsolutePath());
5、public File getAbsoluteFile():與【4】類似,用【4】中getAbsolutePath的String返回值呼叫new File(String pathname)!
//如果是絕對路徑,直接返回;如果是相對路徑,用其path值拼在ContextPath後面
System.out.println(new File("a\\b").getAbsoluteFile());
System.out.println(new File("\\a\\b").getAbsolutePath()); //認為此路徑是絕對路徑,加上碟符返回!
System.out.println(new File("C:\\none").getAbsolutePath());
六、判斷相關的方法:isXXX、canXXX
1、public boolean isDirectory():是否是目錄(不存在也會返回false)
2、public boolean isFile():是否是檔案(不存在也會返回false)
3、public boolean isHidden():是否是隱藏屬性(不存在也會返回false)
4、public boolean canRead():可以讀嗎(不存在也會返回false)
5、public boolean canWrite():可以寫嗎(不存在也會返回false)
綜合示例:
File file = new File("D:\\document"); //document這個目錄已經存在!
System.out.println("file.isDirectory():"+file.isDirectory());
System.out.println("file.isFile():"+file.isFile());
System.out.println("file.isHidden():"+file.isHidden());
System.out.println("file.canRead():"+file.canRead());
System.out.println("file.canWrite():"+file.canWrite());
6、public boolean isAbsolute():pathname是絕對的嗎(這裡要以碟符或者\\,即'\\\\'開頭的才算絕對路徑,\開頭,即'\\',不算!);存不存在都行!
System.out.println(new File("A:\\xxxxxxxxxx\\yyy").isAbsolute()); //true
System.out.println(new File("\\xxxxxxxxxx\\yyy").isAbsolute()); //false
System.out.println(new File("\\\\xxxxxxxxxx\\yyy").isAbsolute()); //true
System.out.println(new File("xxxxxxxxxx\\yyy").isAbsolute()); //false
相關文章
- 除錯模式file.exits判斷目錄異常除錯模式
- 刪除檔案或目錄提示"檔案或目錄無法刪除"的解決方法!
- java判斷檔案是否存在並建立檔案Java
- 刪除目錄及目錄下所有檔案與子目錄 (轉)
- linux 刪除檔案或目錄——rmLinux
- Linux rm(刪除檔案/目錄) 命令Linux
- Python 刪除目錄中特定檔案Python
- python基礎之刪除檔案及刪除目錄的方法Python
- nodejs獲取檔案資訊,判斷是檔案或目錄NodeJS
- 刪除指定目錄下指定字尾的檔案
- 【JAVA :File類的用法(一)】File類的構造方法-File類建立檔案與資料夾Java構造方法
- Java —— 檔案類(File 類)Java
- Linux rm命令:刪除檔案或目錄Linux
- linux rm 命令(刪除檔案和目錄)Linux
- 刪除git已經跟蹤的檔案或者目錄Git
- FileUtils類建立、刪除檔案及資料夾
- rsync同步時,刪除目標目錄比源目錄多餘檔案的方法(--delete)delete
- golang map的判斷,刪除Golang
- Linux如何在目錄下靈活建立、瀏覽、刪除百萬個檔案Linux
- 兩個目錄中,刪除其中一個目錄中同名檔案的做法
- Linux - 判斷檔案/目錄是否存在/具有許可權Linux
- [python]如何刪除目錄下指定格式的檔案Python
- 刪除當前目錄下的所有可執行檔案
- Oracle DG standby刪除歸檔的判斷指令碼Oracle指令碼
- Java : File 檔案類操作Java
- Linux stat函式獲取檔案屬性(檔案大小,建立時間等,判斷普通檔案或者目錄等)Linux函式
- C語言remove()函式:刪除檔案或目錄C語言REM函式
- java進階(34)--File類、目錄複製Java
- 怎麼刪除電腦中開啟的檔案記錄?刪除電腦中開啟的檔案記錄方法教程
- shell判斷檔案,目錄是否存在或者具有許可權【轉】
- linux 刪除問題 一次刪除多個目錄下的相同副檔名的檔案Linux
- C語言判斷檔案存在和建立檔案C語言
- 配置檔案的建立分配及刪除
- linux rm刪除含有特殊符號目錄或者檔案Linux符號
- Linux下建立及刪除帶有空格的目錄Linux
- JAVA程式設計學習記錄(File類檔案操作)Java程式設計
- php判斷檔案存在是用file_exists還是is_filePHP
- linux下刪除目錄及其子目錄下某種型別檔案Linux型別