市住房住房城鄉(xiāng)建設委官方網(wǎng)站友鏈網(wǎng)
目錄
- 簡介
- 一、File的構造方法
- 二、File的常用方法
- 1、獲取功能的方法
- 2、絕對路徑和相對路徑
- 3、判斷功能的方法
- 4、創(chuàng)建、刪除功能的方法
- 5、目錄的遍歷
- 6、遞歸遍歷
- 三、RandomAccessFile
- 1、主要方法
- 四、Apache FileUtils 類
- 1、復制文件或目錄:
- 2、刪除文件或目錄:
- 3、移動文件或目錄:
- 4、查詢文件或目錄的信息:
- 五、Hutool FileUtil 類
- 1、copyFile:復制文件。該方法可以將指定的源文件復制到指定的目標文件中。
- 2、move:移動文件或目錄。該方法可以將指定的源文件或目錄移動到指定的目標文件或目錄中。
- 3、del:刪除文件或目錄。該方法可以刪除指定的文件或目錄,如果指定的文件或目錄不存在,則會拋出異常。
- 4、rename:重命名文件或目錄。該方法可以將指定的文件或目錄重命名為指定的新名稱。
- 5、readLines:從文件中讀取每一行數(shù)據(jù)。
簡介
在 IO 操作中,文件的操作相對來說是比較復雜的,但也是使用頻率最高的部分,我們幾乎所有的項目中幾乎都躺著一個叫做 FileUtil 或者 FileUtils 的工具類。
java.io.File 類是專門對文件進行操作的類,注意只能對文件本身進行操作,不能對文件內容進行操作,想要操作內容,必須借助輸入輸出流。
File 類是文件和目錄的抽象表示,主要用于文件和目錄的創(chuàng)建、查找和刪除等操作。
怎么理解上面兩句話?其實很簡單!
第一句是說 File 跟流無關,File 類不能對文件進行讀和寫,也就是輸入和輸出!
第二句是說 File 可以表示D:\文件目錄1與D:\文件目錄1\文件.txt,前者是文件夾(Directory,或者叫目錄)后者是文件(file),File 類就是用來操作它倆的。
一、File的構造方法
在 Java 中,一切皆是對象,File 類也不例外,不論是哪個對象都應該從該對象的構造說起,所以我們來分析分析File類的構造方法。
比較常用的構造方法有三個:
-
File(String pathname) :通過給定的路徑來創(chuàng)建新的 File 實例。
-
File(String parent, String child) :從父路徑(字符串)和子路徑創(chuàng)建新的 File 實例。
-
File(File parent, String child) :從父路徑(File)和子路徑名字符串創(chuàng)建新的 File 實例。
看文字描述不夠生動、不夠形象、不得勁?沒事,通過舉例馬上就生動形象了,代碼如下:
// 文件路徑名
String path = "/Users/username/123.txt";
File file1 = new File(path);
// 文件路徑名
String path2 = "/Users/username/1/2.txt";
File file2 = new File(path2); -------------相當于/Users/username/1/2.txt
// 通過父路徑和子路徑字符串
String parent = "/Users/username/aaa";
String child = "bbb.txt";
File file3 = new File(parent, child); --------相當于/Users/username/aaa/bbb.txt
// 通過父級File對象和子路徑字符串
File parentDir = new File("/Users/username/aaa");
String child = "bbb.txt";
File file4 = new File(parentDir, child); --------相當于/Users/username/aaa/bbb.txt
注意,macOS 路徑使用正斜杠(/)作為路徑分隔符,而 Windows 路徑使用反斜杠(\)作為路徑分隔符。所以在遇到路徑分隔符的時候,不要直接去寫/或者\。
Java 中提供了一個跨平臺的方法來獲取路徑分隔符,即使用 File.separator,這個屬性會根據(jù)操作系統(tǒng)自動返回正確的路徑分隔符。
File 類的注意點:
- 一個 File 對象代表硬盤中實際存在的一個文件或者目錄。
- File 類的構造方法不會檢驗這個文件或目錄是否真實存在。
因此無論該路徑下是否存在文件或者目錄,都不影響 File 對象的創(chuàng)建。
二、File的常用方法
File 的常用方法主要分為獲取功能、獲取絕對路徑和相對路徑、判斷功能、創(chuàng)建刪除功能的方法。
1、獲取功能的方法
-
getAbsolutePath() :返回此 File 的絕對路徑。
-
getPath() :結果和 getAbsolutePath 一致。
-
getName() :返回文件名或目錄名。
-
length() :返回文件長度,以字節(jié)為單位。
測試代碼如下【注意測試以你自己的電腦文件夾為準】:
File f = new File("/Users/username/aaa/bbb.java");
System.out.println("文件絕對路徑:"+f.getAbsolutePath());
System.out.println("文件構造路徑:"+f.getPath());
System.out.println("文件名稱:"+f.getName());
System.out.println("文件長度:"+f.length()+"字節(jié)");File f2 = new File("/Users/username/aaa");
System.out.println("目錄絕對路徑:"+f2.getAbsolutePath());
System.out.println("目錄構造路徑:"+f2.getPath());
System.out.println("目錄名稱:"+f2.getName());
System.out.println("目錄長度:"+f2.length());
注意:length() 表示文件的長度,File 對象表示目錄的時候,返回值并無意義。
2、絕對路徑和相對路徑
絕對路徑是從文件系統(tǒng)的根目錄開始的完整路徑,它描述了一個文件或目錄在文件系統(tǒng)中的確切位置。在 Windows 系統(tǒng)中,絕對路徑通常以盤符(如 C:)開始,例如 “C:\Program Files\Java\jdk1.8.0_291\bin\java.exe”。在 macOS 和 Linux 系統(tǒng)中,絕對路徑通常以斜杠(/)開始,例如 “/usr/local/bin/python3”。
相對路徑是相對于當前工作目錄的路徑,它描述了一個文件或目錄與當前工作目錄之間的位置關系。在 Java 中,相對路徑通常是相對于當前 Java 程序所在的目錄,例如 “config/config.properties”。如果當前工作目錄是 “/Users/username/project”,那么相對路徑 “config/config.properties” 就表示 “/Users/username/project/config/config.properties”。
注意:
- 在 Windows 操作系統(tǒng)中,文件系統(tǒng)默認是不區(qū)分大小寫的,即在文件系統(tǒng)中,文件名和路徑的大小寫可以混合使用。例如,“C:\Users\username\Documents\example.txt” 和 “C:\Users\Username\Documents\Example.txt” 表示的是同一個文件。但是,Windows 操作系統(tǒng)提供了一個區(qū)分大小寫的選項,可以在格式化磁盤時選擇啟用,這樣文件系統(tǒng)就會區(qū)分大小寫。
- 在 macOS 和 Linux 等 Unix 系統(tǒng)中,文件系統(tǒng)默認是區(qū)分大小寫的。例如,在 macOS 系統(tǒng)中,“/Users/username/Documents/example.txt” 和 “/Users/username/Documents/Example.txt” 表示的是兩個不同的文件。
// 絕對路徑示例
File absoluteFile = new File("/Users/username/example/test.txt");
System.out.println("絕對路徑:" + absoluteFile.getAbsolutePath());// 相對路徑示例
File relativeFile = new File("example/test.txt");
System.out.println("相對路徑:" + relativeFile.getPath());
3、判斷功能的方法
-
exists() :判斷文件或目錄是否存在。
-
isDirectory() :判斷是否為目錄。
-
isFile() :判斷是否為文件。
方法演示,代碼如下:
File file = new File("/Users/username/example");// 判斷文件或目錄是否存在
if (file.exists()) {System.out.println("文件或目錄存在");
} else {System.out.println("文件或目錄不存在");
}// 判斷是否是目錄
if (file.isDirectory()) {System.out.println("是目錄");
} else {System.out.println("不是目錄");
}// 判斷是否是文件
if (file.isFile()) {System.out.println("是文件");
} else {System.out.println("不是文件");
}
4、創(chuàng)建、刪除功能的方法
- createNewFile() :文件不存在,創(chuàng)建一個新的空文件并返回true,文件存在,不創(chuàng)建文件并返回false。
- delete() :刪除文件或目錄。如果是目錄,只有目錄為空才能刪除。
- mkdir() :只能創(chuàng)建一級目錄,如果父目錄不存在,則創(chuàng)建失敗。返回 true 表示創(chuàng)建成功,返回 false 表示創(chuàng)建失敗。
- mkdirs() :可以創(chuàng)建多級目錄,如果父目錄不存在,則會一并創(chuàng)建。返回 true 表示創(chuàng)建成功,返回 false 表示創(chuàng)建失敗或目錄已經(jīng)存在。
開發(fā)中一般用mkdirs();
方法測試,代碼如下:
// 創(chuàng)建文件
File file = new File("/Users/username/example/test.txt");
if (file.createNewFile()) {System.out.println("創(chuàng)建文件成功:" + file.getAbsolutePath());
} else {System.out.println("創(chuàng)建文件失敗:" + file.getAbsolutePath());
}// 刪除文件
if (file.delete()) {System.out.println("刪除文件成功:" + file.getAbsolutePath());
} else {System.out.println("刪除文件失敗:" + file.getAbsolutePath());
}// 創(chuàng)建多級目錄
File directory = new File("/Users/username/example/subdir1/subdir2");
if (directory.mkdirs()) {System.out.println("創(chuàng)建目錄成功:" + directory.getAbsolutePath());
} else {System.out.println("創(chuàng)建目錄失敗:" + directory.getAbsolutePath());
}
5、目錄的遍歷
String[] list() :返回一個 String 數(shù)組,表示該 File 目錄中的所有子文件或目錄。
File[] listFiles() :返回一個 File 數(shù)組,表示該 File 目錄中的所有的子文件或目錄。
File directory = new File("/Users/itwanger/Documents/Github/paicoding");// 列出目錄下的文件名
String[] files = directory.list();
System.out.println("目錄下的文件名:");
for (String file : files) {System.out.println(file);
}// 列出目錄下的文件和子目錄
File[] filesAndDirs = directory.listFiles();
System.out.println("目錄下的文件和子目錄:");
for (File fileOrDir : filesAndDirs) {if (fileOrDir.isFile()) {System.out.println("文件:" + fileOrDir.getName());} else if (fileOrDir.isDirectory()) {System.out.println("目錄:" + fileOrDir.getName());}
}
listFiles在獲取指定目錄下的文件或者子目錄時必須滿足下面兩個條件:
- 指定的目錄必須存在
- 指定的必須是目錄。否則容易引發(fā) NullPointerException 異常
6、遞歸遍歷
不說啥了,直接上代碼:
public static void main(String[] args) {File directory = new File("/Users/itwanger/Documents/Github/paicoding");// 遞歸遍歷目錄下的文件和子目錄traverseDirectory(directory);
}public static void traverseDirectory(File directory) {// 列出目錄下的所有文件和子目錄File[] filesAndDirs = directory.listFiles();// 遍歷每個文件和子目錄for (File fileOrDir : filesAndDirs) {if (fileOrDir.isFile()) {// 如果是文件,輸出文件名System.out.println("文件:" + fileOrDir.getName());} else if (fileOrDir.isDirectory()) {// 如果是目錄,遞歸遍歷子目錄System.out.println("目錄:" + fileOrDir.getName());traverseDirectory(fileOrDir);}}
}
三、RandomAccessFile
RandomAccessFile 是 Java 中一個非常特殊的類,它既可以用來讀取文件,也可以用來寫入文件。與其他 IO 類(如 FileInputStream 和 FileOutputStream)不同,RandomAccessFile 允許您跳轉到文件的任何位置,從那里開始讀取或寫入。這使得它特別適用于需要在文件中隨機訪問數(shù)據(jù)的場景,如數(shù)據(jù)庫系統(tǒng)。
下面是一個使用 RandomAccessFile 的示例,包括寫入和讀取文件:
import java.io.IOException;
import java.io.RandomAccessFile;public class RandomAccessFileDemo {public static void main(String[] args) {String filePath = "logs/javabetter/itwanger.txt";try {// 使用 RandomAccessFile 寫入文件writeToFile(filePath, "Hello, 沉默王二!");// 使用 RandomAccessFile 讀取文件String content = readFromFile(filePath);System.out.println("文件內容: " + content);} catch (IOException e) {e.printStackTrace();}}private static void writeToFile(String filePath, String content) throws IOException {try (RandomAccessFile randomAccessFile = new RandomAccessFile(filePath, "rw")) {// 將文件指針移動到文件末尾(在此處追加內容)randomAccessFile.seek(randomAccessFile.length());// 寫入內容randomAccessFile.writeUTF(content);}}private static String readFromFile(String filePath) throws IOException {StringBuilder content = new StringBuilder();try (RandomAccessFile randomAccessFile = new RandomAccessFile(filePath, "r")) {// 將文件指針移動到文件開始處(從頭開始讀取)randomAccessFile.seek(0);content.append(randomAccessFile.readUTF());}return content.toString();}
}
為了避免中文亂碼問題,我們使用 RandomAccessFile 的 writeUTF 和 readUTF 方法,它們將使用 UTF-8 編碼處理字符串。大家可以運行一下這段代碼,體驗一下。
接下來,會詳細介紹一下 RandomAccessFile 的構造方法和常用的方法。
構造方法
RandomAccessFile 主要有兩個構造方法:
- RandomAccessFile(File file, String mode):使用給定的文件對象和訪問模式創(chuàng)建一個新的 RandomAccessFile 實例。
- RandomAccessFile(String name, String mode):使用給定的文件名和訪問模式創(chuàng)建一個新的 RandomAccessFile 實例。
訪問模式 mode 的值可以是:
- “r”:以只讀模式打開文件。調用結果對象的任何 write 方法都將導致 IOException。
- “rw”:以讀寫模式打開文件。如果文件不存在,它將被創(chuàng)建。
- “rws”:以讀寫模式打開文件,并要求對內容或元數(shù)據(jù)的每個更新都被立即寫入到底層存儲設備。這種模式是同步的,可以確保在系統(tǒng)崩潰時不會丟失數(shù)據(jù)。
- “rwd”:與“rws”類似,以讀寫模式打開文件,但僅要求對文件內容的更新被立即寫入。元數(shù)據(jù)可能會被延遲寫入。
1、主要方法
- long getFilePointer():返回文件指針的當前位置。
- long length():返回此文件的長度。
- int read():從該文件中讀取一個字節(jié)數(shù)據(jù)。
- int read(byte[] b):從該文件中讀取字節(jié)數(shù)據(jù)并將其存儲到指定的字節(jié)數(shù)組中。
- int read(byte[] b, int off, int len):從該文件中讀取字節(jié)數(shù)據(jù)并將其存儲到指定的字節(jié)數(shù)組中,從偏移量 off 開始,最多讀取 len 個字節(jié)。
- String readLine():從該文件中讀取一行文本。
- readUTF():從文件讀取 UTF-8 編碼的字符串。此方法首先讀取兩個字節(jié)的長度信息,然后根據(jù)這個長度讀取字符串的 UTF-8 字節(jié)。最后,這些字節(jié)被轉換為 Java 字符串。這意味著當你使用 readUTF 方法讀取字符串時,需要確保文件中的字符串是使用 writeUTF 方法寫入的,這樣它們之間的長度信息和編碼方式才能保持一致。
- void seek(long pos):將文件指針設置到文件中的 pos 位置。
- void write(byte[] b):將指定的字節(jié)數(shù)組的所有字節(jié)寫入該文件。
- void write(byte[] b, int off, int len):將指定字節(jié)數(shù)組的部分字節(jié)寫入該文件,從偏移量 off 開始,寫入 len 個字節(jié)。
- void write(int b):將指定的字節(jié)寫入該文件。
- writeUTF(String str):將一個字符串以 UTF-8 編碼寫入文件。此方法首先寫入兩個字節(jié)的長度信息,表示字符串的 - - - UTF-8 字節(jié)長度,然后寫入 UTF-8 字節(jié)本身。因此,當你使用 writeUTF 寫入字符串時,實際寫入的字節(jié)數(shù)會比字符串的 UTF-8 字節(jié)長度多兩個字節(jié)。這兩個字節(jié)用于在讀取字符串時確定正確的字符串長度。
再來看一個示例,結合前面的講解,就會徹底掌握 RandomAccessFile。
File file = new File("logs/javabetter/itwanger.txt");try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) {// 寫入文件raf.writeUTF("Hello!");// 將文件指針移動到文件開頭raf.seek(0);// 讀取文件內容String content = raf.readUTF();System.out.println("內容: " + content);} catch (IOException e) {e.printStackTrace();
}
在這個示例中,我們首先創(chuàng)建了一個名為 itwanger.txt 的文件對象。然后我們使用 RandomAccessFile 以讀寫模式打開這個文件。
接下來,我們使用 writeUTF 方法將字符串"Hello, 沉默王二!“寫入文件。然后,我們使用 seek 方法將文件指針移動到文件開頭,并使用 readUTF 方法讀取文件內容。輸出應該是"Hello!”。
最后,我們使用try-with-resources語句確保 RandomAccessFile 在操作完成后被正確關閉。
四、Apache FileUtils 類
FileUtils 類是 Apache Commons IO 庫中的一個類,提供了一些更為方便的方法來操作文件或目錄。
1、復制文件或目錄:
File srcFile = new File("path/to/src/file");
File destFile = new File("path/to/dest/file");
// 復制文件
FileUtils.copyFile(srcFile, destFile);
// 復制目錄
FileUtils.copyDirectory(srcFile, destFile);
2、刪除文件或目錄:
File file = new File("path/to/file");
// 刪除文件或目錄
FileUtils.delete(file);
需要注意的是,如果要刪除一個非空目錄,需要先刪除目錄中的所有文件和子目錄。
3、移動文件或目錄:
File srcFile = new File("path/to/src/file");
File destFile = new File("path/to/dest/file");
// 移動文件或目錄
FileUtils.moveFile(srcFile, destFile);
4、查詢文件或目錄的信息:
File file = new File("path/to/file");
// 獲取文件或目錄的修改時間
Date modifyTime = FileUtils.lastModified(file);
// 獲取文件或目錄的大小
long size = FileUtils.sizeOf(file);
// 獲取文件或目錄的擴展名
String extension = FileUtils.getExtension(file.getName());
五、Hutool FileUtil 類
FileUtil 類是 Hutool 工具包中的文件操作工具類,提供了一系列簡單易用的文件操作方法,可以幫助 Java 開發(fā)者快速完成文件相關的操作任務。
FileUtil 類包含以下幾類操作工具:
- 文件操作:包括文件目錄的新建、刪除、復制、移動、改名等
- 文件判斷:判斷文件或目錄是否非空,是否為目錄,是否為文件等等。
- 絕對路徑:針對 ClassPath 中的文件轉換為絕對路徑文件。
- 文件名:主文件名,擴展名的獲取
- 讀操作:包括 getReader、readXXX 操作
- 寫操作:包括 getWriter、writeXXX 操作
下面是 FileUtil 類中一些常用的方法:
1、copyFile:復制文件。該方法可以將指定的源文件復制到指定的目標文件中。
File dest = FileUtil.file("FileUtilDemo2.java");
2、move:移動文件或目錄。該方法可以將指定的源文件或目錄移動到指定的目標文件或目錄中。
FileUtil.move(file, dest, true);
3、del:刪除文件或目錄。該方法可以刪除指定的文件或目錄,如果指定的文件或目錄不存在,則會拋出異常。
FileUtil.del(file);
4、rename:重命名文件或目錄。該方法可以將指定的文件或目錄重命名為指定的新名稱。
FileUtil.rename(file, "FileUtilDemo3.java", true);
5、readLines:從文件中讀取每一行數(shù)據(jù)。
FileUtil.readLines(file, "UTF-8").forEach(System.out::println);
相關文章鏈接:
javaIO之各種流的分類與實際應用
javaIO流之文件流
javaIO流之字節(jié)流
javaIO流之字符流
javaIO流之緩沖流
javaIO流之轉換流
javaIO流之序列流
贈人玫瑰,手有余香,如果覺得有用,點個贊吧~~~~~