“嗨,阿米戈。好久不見。”

“嗨,Bilaabo。你要談什麼?”

“今天我要給大家講講文件操作。Java 有一個特殊的類(File),可以用來管理硬盤上的文件。對於管理文件內容,還有其他類:FileInputStream、FileOutputStream 等。 “

文件,文件,路徑 - 1

“有趣。但是當你說‘管理文件’時,你是什麼意思?”

“這正是我現在要解釋的。文件可以創建、刪除、重命名等等。您可以將 File 對像傳遞給幾乎每個處理(讀取、寫入、更改)文件內容的類。 例如:”

您可以將文件名直接傳遞給 FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
或者可以單獨創建一個File對象,然後傳給FileInputStrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

“但是第二個選項更長。我還是不明白為什麼我們需要這些文件對象。”

“對於這個具體的例子,你是對的。”這不是你必須如何做的例子,而是你可以如何做的例子。
但是想像一下,您需要顯示位於特定目錄中的所有文件的列表。以下是如何使用 File 對象完成此操作:"

代碼
File folder = new File("c:/path/");
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

“ listFiles()是一種返回由 «c:/path/» 指示的文件夾中的文件列表的方法嗎?”

“是啊,不過程序員一般都說‘目錄’,‘文件夾’這個詞是最近才用的,但原則上這兩個詞都對,你說哪個都行。”

“好的。那麼getName ()是做什麼的呢?返回文件名?文件名中到底包含什麼?是包含路徑的全名,還是文件本身的名稱?”

“只有文件本身的名稱。對於完整路徑,有 file.getAbsolutePath()。”

“那麼 File 類還有哪些其他方法?”

“看看這個:”

方法 描述
boolean isDirectory() File 對像是一個目錄嗎?
boolean isFile() 對像是文件嗎?
long length() 以字節為單位返回文件大小/長度。
boolean createNewFile() 如果具有此名稱的文件尚不存在,則創建一個新的空文件。
boolean mkdir() 創建一個目錄。名稱 «mkdir» 來自 «make directory»。
boolean mkdirs() 創建目錄及其所有子目錄。
boolean delete() 刪除與對象關聯的文件。如果對像是目錄,則僅當目錄中沒有文件時才刪除該目錄。
void deleteOnExit() 將文件添加到一個特殊的文件列表中,該列表將在程序退出時自動刪除。
File createTempFile(
String prefix,
String suffix,
File directory)
使用隨機生成的唯一名稱創建一個臨時文件,類似於 «dasd4d53sd»。
附加參數是名稱前綴和後綴。如果未指定目錄,則會在臨時文件的特殊操作系統目錄中創建該文件。
boolean exists() 如果硬盤驅動器上存在同名文件,則返回真。
String getAbsolutePath() 返回文件及其所有子目錄的完整路徑。
String getCanonicalPath() 返回規範文件路徑。
例如,將路徑 «c:/dir/dir2/../a.txt» 轉換為 «c:/dir/a.txt»
String[] list() 返回當前對象表示的目錄中包含的文件名數組。
File[] listFiles() 返回包含在當前 File 對象表示的目錄中的文件數組。
long getTotalSpace() 返回文件所在磁盤上的總空間量(字節數)。
long getFreeSpace() 返回文件所在磁盤上的可用空間量(字節數)。
boolean renameTo(File) 重命名文件,即文件的內容實際上得到一個新名稱。換句話說,您可以將文件 «c:/dir/a.txt» 重命名為 «d:/out/text/b.doc»。
String getName() 只返回沒有路徑的文件名。
String getParent() 僅返回當前文件的路徑(目錄),不返回名稱本身。
Path toPath() 返回對應於當前 File 對象的 Path 對象。

“哇!不是一個非常小的列表,是吧?而且你似乎可以用它做很多事情:創建和刪除文件,重命名它們,......”

“所以要獲取當前文件的目錄,我需要調用getParent()?”

“是的,但它返回一個字符串——文件路徑——而不是一個 File 對象。實際上,File 類幾乎複製了它的所有方法:一個版本返回一個字符串,另一個——一個 File 對象。檢查一下:”

File file = new File("c:/path/a.txt");
String directory = file.getParent();
File file = new File("c:/path/a.txt");
File directory = file.getParentFile();

如果您有一個帶有文件路徑的 String 並且您需要一個File對象,則使用構造函數。如果情況相反(你有一個File對象但你需要一個 String),那麼使用getAbsolutePath ()。例如:”

String path = "c:/a.txt";
File file = new File(path);
File file = new File("c:/a.txt");
String path = file.getAbsolutePath();

“知道了。”

“太好了。那麼給你一個小任務:顯示與當前文件位於同一目錄下的所有文件的名稱。”

“沒有比這更容易的了。看,看:”

代碼
//Some file
File originalFile = new File("c:/path/dir2/a.txt");

//An object representing the directory
File folder = originalFile.getParentFile();

//Print the file list on screen
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

“嗯。沒錯。”

“但有點令人困惑的是,同一個類——文件——同時用於文件和目錄。這對我來說似乎不太合邏輯。”

“由於歷史原因,它是這樣解決的。目錄曾經是磁盤上一個特殊的‘空’文件。當然,現在發生了很多變化,但不是全部。這就是我今天所擁有的。”

“感謝有趣的課程,Bilaabo。”