#Java教程:File類:檔案、目錄的建立、刪除、判斷、getXXX、canXXX @FDDLC

凡我出品,皆屬精品發表於2020-12-05

一、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

 

相關文章