1.Files

文件類

要處理文件,有一個巧妙的實用​​程序類 — java.nio.file.Files. 它有適合各種場合的方法。這個類的所有方法都是靜態的,並且對 Path 對象進行操作。有很多方法,所以我們只考慮最重要的方法:

方法 描述
Path createFile(Path path)
創建一個新文件,其路徑為path
Path createDirectory(Path path)
創建一個新目錄
Path createDirectories(Path path)
創建多個目錄
Path createTempFile(prefix, suffix)
創建一個臨時文件
Path createTempDirectory(prefix)
創建一個臨時目錄
void delete(Path path)
刪除一個文件或目錄,如果它是空的
Path copy(Path src, Path dest)
複製文件
Path move(Path src, Path dest)
移動文件
boolean isDirectory(Path path)
檢查路徑是否是目錄而不是文件
boolean isRegularFile(Path path)
檢查路徑是否是文件而不是目錄
boolean exists(Path path)
檢查給定路徑中是否存在對象
long size(Path path)
返回文件大小
byte[] readAllBytes(Path path)
以字節數組的形式返回文件的全部內容
String readString(Path path)
以字符串形式返回文件的全部內容
List<String> readAllLines(Path path)
以字符串列表的形式返回文件的全部內容
Path write(Path path, byte[])
將字節數組寫入文件
Path writeString(Path path, String str)
將字符串寫入文件
DirectoryStream<Path> newDirectoryStream(Path dir)
從給定目錄返回文件(和子目錄)的集合

2.創建文件和目錄

文件和目錄很容易創建。讓我們用一些例子說服自己:

代碼 筆記
Files.createFile(Path.of("c:\\readme.txt"));
創建一個文件
Files.createDirectory(Path.of("c:\\test"));
創建一個目錄
Files.createDirectories(Path.of("c:\\test\\1\\2\\3"));
創建一個目錄和所有必要的子目錄(如果它們不存在)。

3.複製、移動、刪除

複製、移動和刪除文件同樣簡單。這也適用於目錄,但它們必須是空的。

代碼 筆記
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("c:\\readme-copy.txt");
Files.copy(path1, path2);
複製文件
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("d:\\readme-new.txt");
Files.move(path1, path2);
移動和重命名文件
Path path = Path.of("d:\\readme-new.txt");
Files.delete(path);
刪除文件

4. 檢查文件的類型和存在

當你有別人提供的路徑時,你想知道它是文件還是目錄。一般來說,這樣的文件/目錄是否存在?

這也有特殊的方法。您還可以輕鬆找出文件的長度:

代碼 筆記
Files.isRegularFile(Path.of("c:\\readme.txt"));
true
Files.isDirectory(Path.of("c:\\test"));
true
 Files.exists(Path.of("c:\\test\\1\\2\\3"));
false
Files.size(Path.of("c:\\readme.txt"));
10112

5. 處理文件內容

最後,還有一系列的方法可以輕鬆讀取或寫入文件的內容。例子:

代碼 描述
Path path = Path.of("c:\\readme.txt");
List<String> list = Files.readAllLines(path);

for (String str : list)
   System.out.println(str);

讀取文件內容作為字符串列表。

顯示字符串


6.獲取目錄內容

最有趣的方法仍然存在。它用於獲取給定目錄中的文件和子目錄。

我們正在談論newDirectoryStream()返回一個特殊DirectoryStream<Path>對象的方法。它有一個迭代器(!),您可以使用它來獲取給定目錄的所有文件和子目錄。

這比聽起來容易。

代碼 描述
Path path = Path.of("c:\\windows");

try (DirectoryStream<Path> files = Files.newDirectoryStream(path)) {
   for (Path path : files)
      System.out.println(path);
}


獲取包含文件列表的對象
遍歷文件列表

DirectoryStream<Path>對像有兩個屬性。首先,它有一個返回文件路徑的迭代器,我們可以在循環中使用這個對象for-each

其次,這個對像是一個數據流,所以它必須使用close()方法顯式關閉,或者在try-with-resources塊中聲明使用。



七、Files.newInputStream方法

從 Java 5 開始,FileInputStreamFileOutputStream類已被棄用。它們的缺點之一是當創建這些類的對象時,會立即在磁盤上創建文件。並且所有與文件創建相關的異常都可能被拋出。

後來這被認為不是最好的決定。因此,建議使用java.nio.Files實用程序類的方法來創建文件對象。

這是創建文件的舊方法和新方法之間的比較:

String src = "c:\\projects\\log.txt";
InputStream input = new FileInputStream(src);
String src = "c:\\projects\\log.txt";
InputStream input = Files.newInputStream( Path.of(src) );

並且有一個類似的替代品FileOutputStream

String src = "c:\\projects\\log.txt";
OutputStream  output = new FileOutputStream( src );
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );