java.nio.file.Files
包含所有允許我們對Path對象執(zhí)行大多數(shù)文件操作的靜態(tài)方法。
文件可以創(chuàng)建常規(guī)文件,目錄,符號鏈接和臨時文件/目錄。
大多數(shù)方法接受FileAttribute類型的varargs參數(shù),這允許我們指定文件屬性。
createFile()方法創(chuàng)建一個新的常規(guī)文件。創(chuàng)建的新文件為空。
如果文件已存在,或父目錄不存在,文件創(chuàng)建將失敗。
以下代碼顯示如何創(chuàng)建新文件。
import java.io.IOException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) { Path p1 = Paths.get("test.txt"); try { Files.createFile(p1); System.out.format("File created: %s%n", p1.toRealPath()); } catch (FileAlreadyExistsException e) { System.out.format("File %s already exists.%n", p1.normalize()); } catch (NoSuchFileException e) { System.out.format("Directory %s does not exists.%n", p1.normalize() .getParent()); } catch (IOException e) { e.printStackTrace(); } } }
上面的代碼生成以下結(jié)果。
createDirectory()和createDirectories()方法創(chuàng)建一個新目錄。
如果父目錄不存在,createDirectory()方法將失敗。
createDirectories()方法創(chuàng)建不存在的父目錄。
createTempDirectory()和createTempFile()方法分別創(chuàng)建一個臨時目錄和一個臨時文件。
以下代碼顯示了如何創(chuàng)建臨時文件和目錄。
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) throws Exception { String dirPrefix = "KDir"; Path tDir = Files.createTempDirectory(dirPrefix); System.out.println("Temp directory: " + tDir); String fPrefix = "Header_"; String fSuffix = ".txt"; Path tFile1 = Files.createTempFile(fPrefix, fSuffix); System.out.println("Temp file1: " + tFile1); Path p1 = Paths.get("C:\\temp"); Path tFile2 = Files.createTempFile(p1, fPrefix, fSuffix); System.out.println("Temp file2: " + tFile2); } }
不會自動刪除臨時文件/目錄。我們可能希望使用java.io.File類的deleteOnExit()方法在JVM退出時刪除該文件。
Path tempFile = Files.createTempFile("myTempFile", ".txt"); tempFile.toFile().deleteOnExit();
上面的代碼生成以下結(jié)果。
從文件中刪除(Path p)和deleteIfExists(Path p)以刪除文件,目錄和符號鏈接。
如果刪除失敗,delete()方法將拋出異常。
如果要刪除的文件不存在,deleteIfExists()方法不會拋出NoSuchFileException異常。
如果它刪除文件,則返回true。否則,它返回false。
以下代碼顯示如何刪除文件和處理異常:
import java.io.IOException; import java.nio.file.DirectoryNotEmptyException; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) throws Exception { Path p = Paths.get("C:\\Java_Dev\\test1.txt"); try { Files.delete(p); System.out.println(p + " deleted successfully."); } catch (NoSuchFileException e) { System.out.println(p + " does not exist."); } catch (DirectoryNotEmptyException e) { System.out.println("Directory " + p + " is not empty."); } catch (IOException e) { e.printStackTrace(); } } }
上面的代碼生成以下結(jié)果。
文件類有兩個方法,分別是exists(Path p,LinkOption ... options)和notExists(Path p,LinkOption ... options)來檢查文件的存在和不存在。
文件類復(fù)制(Path source,Path target,CopyOption ... options)方法可以將指定的源路徑復(fù)制到指定的目標(biāo)路徑。
如果指定的源文件是符號鏈接,則將復(fù)制符號鏈接的目標(biāo),而不是符號鏈接。
如果指定的源文件是目錄,則創(chuàng)建目標(biāo)位置處的空目錄,而不復(fù)制目錄的內(nèi)容。
我們可以使用copy()方法指定一個或多個以下復(fù)制選項:
我們可以指定REPLACE_EXISTING選項來替換現(xiàn)有的目標(biāo)文件。
如果目標(biāo)文件是符號鏈接,并且如果存在,則通過指定REPLACE_EXISTING選項而不是符號鏈接的目標(biāo)來替換符號鏈接。
COPY_ATTRIBUTES選項將源文件的屬性復(fù)制到目標(biāo)文件。
如果使用NOFOLLOW_LINKS選項,則copy()方法復(fù)制符號鏈接,而不是符號鏈接的目標(biāo)。
以下代碼顯示了使用copy()方法復(fù)制文件。如果復(fù)制操作失敗,它會處理可能的異常。
import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.Files; import java.io.IOException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.DirectoryNotEmptyException; import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES; public class Main { public static void main(String[] args) { Path source = Paths.get("C:\\Java_Dev\\test1.txt"); Path target = Paths.get("C:\\Java_Dev\\test1_backup.txt"); try { Path p = Files.copy(source, target, REPLACE_EXISTING, COPY_ATTRIBUTES); System.out.println(source + " has been copied to " + p); } catch (FileAlreadyExistsException e) { System.out.println(target + " already exists."); } catch (DirectoryNotEmptyException e) { System.out.println(target + " is not empty."); } catch (IOException e) { e.printStackTrace(); } } }
Files類的move(Path source,Path target,CopyOption ... options)方法移動或重命名文件。
如果指定的目標(biāo)文件已存在,則移動操作將失敗。
我們可以指定REPLACE_EXISTING選項來替換現(xiàn)有的目標(biāo)文件。
如果要移動的文件是符號鏈接,它將移動符號鏈接,而不是符號鏈接的目標(biāo)。
move()方法只能用于移動一個空目錄。
除了REPLACE_EXISTING復(fù)制選項,我們可以使用ATOMIC_MOVE作為另一個CopyOption。
如果使用ATOMIC_MOVE選項,如果無法以原子方式移動文件,則會拋出AtomicMoveNotSupportedException。
如果指定ATOMIC_MOVE選項,則忽略所有其他選項。
以下代碼顯示了如何通過處理可能的異常來移動文件:
import static java.nio.file.StandardCopyOption.ATOMIC_MOVE; import java.io.IOException; import java.nio.file.AtomicMoveNotSupportedException; import java.nio.file.DirectoryNotEmptyException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.nio.file.Paths; public class Main { public static void main(String[] args) throws Exception { Path source = Paths.get("C:\\Java_Dev\\test1.txt"); Path target = Paths.get("C:\\Java_Dev\\dir2\\test1.txt"); try { Path p = Files.move(source, target, ATOMIC_MOVE); System.out.println(source + " has been moved to " + p); }catch (NoSuchFileException e) { System.out.println("Source/target does not exist."); } catch (FileAlreadyExistsException e) { System.out.println(target + " already exists. Move failed."); } catch (DirectoryNotEmptyException e) { System.out.println(target + " is not empty. Move failed."); } catch (AtomicMoveNotSupportedException e) { System.out.println("Atomic move is not supported. MOve failed."); } catch (IOException e) { e.printStackTrace(); } } }
上面的代碼生成以下結(jié)果。
更多建議: