Java 文件 - Java.nio.file.Files 类

Java 文件类是在 Java 1.7 中引入的,是java.nio.file包的一部分。

Java 文件类

java Files class, java NIO Files

  • Java 文件类包含 static 方法,用于文件和目录
  • 此类用于创建、阅读、写入、复制和删除文件或目录的基本文件操作

在继续前进之前,让我们先看看下面的术语:

  1. Path:这是取代 java.io.File 类作为在 Java NIO 中工作时的文件或目录的表示的界面。 Paths: 此类包含一个静态方法来创建 Path 实例。

java.nio.file.Path interface is just like the old java.io.File class. Path represents location of the file and when we create a Path to new file, it does not create actual file until we create it using Files.createFile(Path filePath). java file path, Java NIO Files Paths As we can see in above diagram, Paths class is used to create instance of Path and Files class uses Path instance to work on a file. File and Path objects know how to convert to the other, that’s how we can use older code to interact with new Files utility.

Java IO 与 NIO

Java IO vs NIO

如何创造道路

我们可以创建一个Path的对象,通过调用Paths.get(String first, String... more)方法的Paths类。

1Path path1 = Paths.get("/tmp/file.txt"); // For UNIX
2
3Path path2 = Paths.get("D:/data/file.txt"); // For Windows

我们也可以通过在Paths.get()方法中分离路径部分来创建一个Path对象。

1Path path1 = Paths.get("/tmp", "file.txt");
2
3Path path2 = Paths.get("D:", "data", "file.txt");
4
5Path path3 = Paths.get("D:/data", "file.txt") ;

正如我们所看到的,我们可以在Paths.get()方法中单独传递文件夹和文件名。

Java 檔案方法

Java NIO 文件类包含用于操纵文件和目录的静态方法,这些方法主要在Path对象上工作。

  1. 联合国 ** 复制件( 输入结构、 路径目标、 复制选项) : ** 这种方法将指定输入流的所有字节复制到指定的目标文件,并返回读取或写入的字节数作为长值.
  2. ** 复制件( 纸张来源, 输出结构外出 ): ** 这种方法从指定的源文件复制所有字节到给定输出流,并返回读取或写入的字节数作为长值.
  3. ** 副本( Path 来源、 路径目标、 复制选项... 选项) : ** 这种方法复制给指定目标文件的源文件并返回目标文件的路径。 (_) (英语). 4. ** 创建目录( Path dir, 文件属性 <? > ... aters):** 此方法首先创建所有不存在的父目录, 从而使用给定路径创建目录 。 如果目录已经存在而无法创建, 这种方法将不会丢弃例外 。 文件属性是创建已不存在目录时自动设置的可选参数,它返回所创建目录的路径. ( (英语). 5. ** 创建 Directory( Path dir, 文件属性 <? > ... atts):** 这种方法使用给定路径创建目录,如果成功创建目录,将返回所创建目录的路径. 如果目录已经存在, 它会丢出 nio. file 。 File AreadyExists Exception.
  4. 存档副本. ** 创建文件( Path 路径, 文件属性 <? > ... aters ): ** 这种方法使用给定的路径创建了新的空文件,如果创建成功,则返回新建文件的路径. 如果文件已经存在, 它会扔出 nio. file 。 FileExists Exception.
  5. ** 创建TempDirectory(Path dir,字符串前缀,文件属性 . aters):** 这种方法使用给定路径创建了临时目录,并将使用给定前缀生成目录名称. 它会返回新创建的临时目录的路径 。 (_) (英语). 8. ** 创建TempDirectory( 字符串前缀, 文件属性 <? > ... atts): ** 这种方法在默认的临时文件目录中创建一个临时目录,并使用给定的前缀生成目录的名称. 它会返回与默认文件系统相关的新创建的临时目录的路径.
  6. ** 创建TempFile( Path dir, 字符串前缀, 字符串后缀, 文件属性 <? > ... aters): ** 这种方法在指定目录创建临时文件,并使用给定的前缀和后缀生成文件名并返回新创建文件的路径. (_)
  7. ** 创建TempFile(字符串前缀,字符串后缀,文件属性... aters):** 这种方法在默认的临时文件目录中创建了临时文件并使用给定的前缀和后缀生成文件名并返回新创建文件的路径. (_) )11 (英语). ** 删除( 路径):** 这是一种无效的方法,只需从指定的路径删除文件。 此方法将 ** NoSuchFileException ** 如果文件在指定的路径不存在, 如果文件是目录, 并且可能不会被空并无法删除, 则将丢出( _) )12 (英语). ** 删除Exists( 路径): ** 这种方法检查是否在删除文件之前存在文件, 如果给定路径的文件被成功删除, 返回布尔值为真, 如果文件在给定路径不存在, 则返回为假 。 如果文件为目录, 且可能不会被空并无法被删除, 则将丢弃( ) )13 (英语). ** 存在(途径):** 如果文件在指定路径存在, 且文件存在, 则会返回真实, 否则会返回虚假 。 () )14. ** GetLast Modified Time( 路径, 链接选项... 选项) : ** 此方法从给定路径返回文件的上次修改时间为 15 。 ** GetOwner( 路径, 链接选项... 选项): ** 这种方法返回 ** UserPrior** 代表给定路径的文件所有者.
  8. ** 是 Directory( 路径, 链接选项... ) : ** 此方法检查文件是否是一个来自给定路径的目录 。 如果文件为目录, 如果文件不存在或不是目录, 或文件为目录, 则返回真实 。 () )17 (英语). ** 是可执行文件( 路径 ): ** 这个方法检查给定路径的文件是否可执行,它也检查文件是否存在,并且这个JVM有执行文件的适当特权. 如果文件存在于给定路径,且文件不存在或JVM没有足够的权限执行文件或无法确定访问权限,则返回为真。 () )18 (英语). ** 隐藏( 路径): ** 这种方法说明给定的文件是否被认为是被隐藏的. 隐藏的确切定义是平台或提供者依赖. 如果是 UNIX 系统,如果文件名称以周期字符开头,则文件被视为隐藏文件( ". " ) 而对于WINDOWS文件,如果它不是一个目录,DOS隐藏属性被设定,则被视为被隐藏. 如果给定路径的文件被视为被隐藏或其他虚假,则返回真实性 。 () )19 (英语). ** 可读( 路径): ** 此方法测试给定路径的文件是否可读 。 如果在指定路径上的文件存在,且文件不存在或由于JVM没有足够的特权或访问无法确定而被拒绝读取,则它会重新运行为真实. () )20 (英语). ** 可写入( 路径): ** 此方法测试文件在给定路径是否可写 。 如果在指定路径上的文件存在,且文件不存在或由于JVM没有足够的特权或访问无法确定而被拒绝,则它会重新运行为真,并且是可写和虚假的. () )21 (英语). ** 移动( 路径源、 路径目标、 复制选项... 选项) : ** 这种方法可以移动或重命名源文件到目标文件并返回目标文件的路径. 备选参数可包括: REPLACE_EXISTING: 它意味着如果目标文件存在,那么如果它不是一个非空目录,就替换它. ** ATOMIC_MOVE:** 它意味着移动是作为原子文件系统操作进行的,所有其他选项都被忽视. 如果目标文件存在但无法被替换,此方法将丢出 ** FileAleadyExists Exception ,因为没有指定 REPLACE_EXISTING 选项. 如果指定了REPlACE EXISTING** 选项, 此方法将丢出 ** Directory NotEmpty Exception , 但无法替换文件, 因为它是一个非空目录 。 () )22 (英语). ** 新缓冲读取器( Path 路径, 字符集 cs) : ** 这种方法通过返回用于从文件中读取文本的缓冲读取器来打开一个用于读取的指定路径的文件 。 文件的字节使用指定的字符集解码为字符. () )23 (英语). ** 新BufferedWriter( 路径、 字符集、 打开选项... 选项) : ** 这种方法打开或创建文件, 使用给定的路径进行写入, 将曾经写入文件的 BufferedWriter 返回 。 选项参数指定了文件的创建或打开方式. 如果没有指定选项,那么它默认会考虑CREATE,TRUNCATE_EXISTINGWRITE选项,这意味着它打开文件进行写入,如果文件不存在,就会创建文件,如果存在,则将现有文件切换为0大小. 如果指定了不支持的选项, 此方法将丢出 ** 未支持的操作例外 。 24 。 ** 新ByteChannel( Path 路径, Open option... 选项): ** 这种方法通过返回访问文件的可搜索字节通道,通过指定路径创建或打开文件. 如果指定了不支持的选项, 此方法将丢出 ** 未支持的操作例外 。 () )25 (英语). ** 新设 目录Stream( 路径 ): ** 这种方法打开了目录,将目录Stream从指定的路径返回到目录中所有条目上。 DirectorStream的路由器返回的元素是类型路径,每个元素代表目录中的一个条目. 如果在给定路径上的文件无法打开, 此方法将丢出 ** Not Directory Exception **, 因为它不是一个目录 。 () )26 (英语). ** 新设 目录Stream( Path 路径, 过滤器 < ? 超级路径 > 过滤器 : ** 这种方法打开了目录,将目录Stream从指定的路径返回到目录中所有条目上。 DirectorStream的路由器返回的元素属于类型路径,每个元素代表目录中的一个条目,这些条目被指定的过滤器过滤. 如果在给定路径上的文件无法打开, 此方法将丢出 ** Not Directory Exception , 因为它不是一个目录 。 (_) )27 (英语). ** 新设 目录Stream( Path 路径, 字符串 glob ): ** 这种方法打开了目录,将目录Stream从指定的路径返回到目录中所有条目上。 DirectorStream的路由器返回的元素属于类型路径,每个元素都代表目录中的一个条目,这些条目通过将文件名称的字符串表示方式与指定的闪烁模式相匹配来过滤. 如果文件无法打开给定路径, 则该方法将丢出 ** Not DirectoryExcution , 如果模式无效, 则不能打开该文件。 ( _) )28 (英语). ** 新输入结构( 路径, Openoption... 选项) : ** 这种方法通过返回输入流打开文件,从指定的路径读取文件. 选项参数是确定文件是如何打开的,如果没有指定选项,则以READ打开文件 如果指定了选项的无效组合,该方法将丢出 ** Illegal Argument Exception ** 如果指定了不支持的选项,则丢出 ** 未支持的操作Exception ** 。 (_) )29 (英语). ** 新输出结构( Path 路径, Openoption... 选项) : ** 这种方法通过返回输出流打开一个文件,以便在指定的路径中写入文件的字节. 选项参数是确定文件是如何打开的,如果没有指定选项,则默认考虑CREATE,TRUNCATE_EXISTINGWRITE**选项,这意味着它打开文件进行写入,如果文件不存在,或者如果存在,则将现有文件切换为0大小. 如果指定了选项的无效组合,此方法将丢出 ** Illegal Argument Exception ** 如果指定了不支持的选项,则丢出 ** 未支持的操作Exception ** 。
  9. ** Notexists(Path path, Link Option option): ** 此方法测试文件在指定路径是否不存在 。 选项参数用于表示文件是象征性链接时如何处理符号链接. 默认情况下,会遵循符号链接. 如果存在NOFOLLOW_LINK选项,则不遵循符号链接。 如果文件在指定的路径不存在,如果文件存在或无法确定文件的存在,则此方法返回真实性。 31。 ** read AllBytes( 路径): ** 这种方法在给定路径读取文件中的所有字节并返回包含从文件中读取的字节数组. (_) ) 32 (英语). ** read AllLines(Path path, Charset cs):** 这种方法在给定路径读取文件的所有行并返回 ** [列表] (/community/tutoris/java-list) ** ,其中包含文件的行.
  10. ** 大小( 路径) : ** 这种方法以字节来返回指定路径中的文件大小.
  11. ** 行走文件( Path start, File Visitor) < ? 超级路径>访客:** 这种方法用于穿行目录. 它在指定的路径上向后旋转目录, 并返回起始文件 。 35。 ** write( Path 路径, 字节[ ] 字节, Open option... 选项 ): ** 这种方法将字节写入指定路径的文件 。 选项参数指定了文件的创建或打开方式. 如果没有指定选项,那么它默认会考虑CREATE,TRUNCATE_EXISTINGWRITE选项,这意味着它打开文件进行写入,如果文件不存在,就会创建文件,如果存在,则将现有文件切换为0大小. 字节数组中的所有字节都写入文件. 这种方法确保文件在所有字节被写入后关闭并返回已写入文件的路径. (_) (英语)

使用文件类创建文件

檔案類提供「createFile(Path filePath, FileAttribute... attrs)」方法來使用指定的「Path」來創建檔案。

 1package com.journaldev.examples;
 2
 3import java.io.IOException;
 4import java.nio.file.Files;
 5import java.nio.file.Path;
 6import java.nio.file.Paths;
 7
 8/**
 9 * Java Create file using Files class
10 * 
11 * @author pankaj
12 *
13 */
14public class FilesCreateFileExample {
15
16    public static void main(String[] args) {
17    	
18    	//initialize Path object
19    	Path path = Paths.get("D:/data/file.txt");
20    	//create file
21    	try {
22    		Path createdFilePath = Files.createFile(path);
23    		System.out.println("File Created at Path : "+createdFilePath);
24    	} catch (IOException e) {
25    		e.printStackTrace();
26    	}
27    }
28}

上述方案的结果如下:

1File Created at Path : D:\data\file.txt

使用文件类创建目录

檔案類提供「createDirectory(Path dir, FileAttribute... attrs)」和「createDirectories(Path dir, FileAttribute... attrs)」的方法,以使用指定的「Path」來創建單位和多層目錄。

 1package com.journaldev.examples;
 2
 3import java.nio.file.Files;
 4import java.nio.file.Path;
 5import java.nio.file.Paths;
 6
 7/**
 8 * Java Create directories using Files class
 9 * 
10 * @author pankaj
11 *
12 */
13public class FilesCreateDirectoriesExample {
14
15    public static void main(String[] args) {
16    	// initialize Path objects
17    	Path path1 = Paths.get("D:/pankaj");
18    	Path path2 = Paths.get("D:/pankaj/java7");
19    	Path path3 = Paths.get("D:/pankaj/java7/Files");
20    	
21    	try {
22    		Path createdDir1 = Files.createDirectory(path1);//first level directory
23    		Path createdDir2 = Files.createDirectory(path2);//second level directory
24    		Path createdDir3 = Files.createDirectory(path3);//all level directories
25    		System.out.println("First Level Directory Created at Path : "+createdDir1);
26    		System.out.println("Second Level Directory Created at Path : "+createdDir2);
27    		System.out.println("All Level Directories Created at Path : "+createdDir3);
28    	} catch (Exception e) {
29    		e.printStackTrace();
30    	}
31    }
32}

上述方案的结果如下:

1First Level Directory Created at Path : D:\pankaj
2Second Level Directory Created at Path : D:\pankaj\java7
3All Level Directories Created at Path : D:\pankaj\java7\Files

将文件转换为 Path 和 vice versa

File 和 Path 对象可以通过以下方法相互转换:

1File file = new File(“D:/data/file.txt”);
2
3Path path = file.toPath();
4
5File file1 = path.toFile();

使用 File Class 读取文件数据

文件类提供以下方法来读取文件。

  1. readAllBytes(Path path):此方法读取在给定路径上的文件中的所有字节,并返回包含从文件中读取的字节的字节数组
  2. readAllLines(Path path,Charsetcs):此方法读取在给定路径上的文件中的所有行,并返回包含从文件中的行的 List

让我们来看看下面的示例计划。

 1package com.journaldev.examples;
 2
 3import java.nio.file.Files;
 4import java.nio.file.Path;
 5import java.nio.file.Paths;
 6import java.util.List;
 7
 8/**
 9 * Java Files read file example
10 * 
11 * @author pankaj
12 *
13 */
14public class FilesReadFileExample {
15
16    public static void main(String[] args) {
17    	
18    	Path path = Paths.get("D:/data/file.txt");
19    	try {
20    		byte[] bs = Files.readAllBytes(path);
21    		List<String> strings = Files.readAllLines(path);
22    		
23    		System.out.println("Read bytes: \n"+new String(bs));
24    		System.out.println("Read lines: \n"+strings);
25    	} catch (Exception e) {
26    		e.printStackTrace();
27    	}
28    }
29
30}

上面的项目结果如下:

1Read bytes: 
2Hello world
3This is Read file example
4Thank you
5Read lines: 
6[Hello world, This is Read file example, Thank you]

使用 File Class 复制文件

文件类提供复制(路径源,路径目标,CopyOption...选项)的方法,它将给定的源文件复制到指定的目标文件,并返回目标文件的路径。

 1package com.journaldev.examples;
 2
 3import java.nio.file.Files;
 4import java.nio.file.Path;
 5import java.nio.file.Paths;
 6import java.nio.file.StandardCopyOption;
 7
 8/**
 9 * Java Files copy file example
10 * 
11 * @author pankaj
12 *
13 */
14public class FilesCopyFileExample {
15
16    public static void main(String[] args) {
17    	Path sourcePath = Paths.get("D:/data/sourceFile.txt");
18    	Path targetPath = Paths.get("D:/data/targetFile.txt");
19    	
20    	try {
21    		Path path = Files.copy(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//copy with REPLACE_EXISTING option
22    		System.out.println("Target file Path : "+path);
23    		System.out.println("Copied Content : \n"+new String(Files.readAllBytes(path)));
24    	} catch (Exception e) {
25    		e.printStackTrace();
26    	}
27
28    }
29
30}

上面的项目结果如下:

1Target file Path : D:\data\targetFile.txt
2Copied Content : 
3Hello world
4This is Copy file example
5Thank you

使用 File Class 移动文件

Java 檔案類提供「移動(路徑來源,路徑目標, CopyOption... 選項)」方法,將來源檔案移動或重命名為目標檔案,並返回目標檔案的路徑。 選項參數可能包括下列: REPLACE_EXISTING: 這意味著如果目標檔案存在,那麼會取代它,如果它不是一個非空的目錄。 ATOMIC_MOVE: 這意味著移動作為原子檔案系統操作,而所有其他選項都被忽略。

 1package com.journaldev.examples;
 2
 3import java.nio.file.Files;
 4import java.nio.file.Path;
 5import java.nio.file.Paths;
 6import java.nio.file.StandardCopyOption;
 7
 8/**
 9 * Java Files move file example
10 * 
11 * @author pankaj
12 *
13 */
14public class FilesMoveFileExample {
15
16    public static void main(String[] args) {
17    	Path sourcePath = Paths.get("D:/data/sourceFile.txt");
18    	Path targetPath = Paths.get("D:/data/targetFile.txt");
19    	try {
20    		Path path = Files.move(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//move with REPLACE_EXISTING option
21    		System.out.println("Target file Path : "+path);
22    		System.out.println("Moved Content : \n"+new String(Files.readAllBytes(path)));
23    	} catch (Exception e) {
24    		e.printStackTrace();
25    	}
26    }
27
28}

使用 File Class 编写文件

Java NIO 檔案類提供「 Write(Path path, byte[] bytes, OpenOption... options)」的方法,在指定路徑上寫字節到檔案. 選項參數規定了檔案是如何創建或開啟的. 如果沒有選項是指定的,那麼它會考慮到 CREATE, TRUNCATE_EXISTINGWRITE的默認選項。 這意味著它會開啟檔案寫作,如果檔案不存在,就會創建或將現有檔案縮小到 0 尺寸,如果它存在。

 1package com.journaldev.examples;
 2
 3import java.nio.file.Files;
 4import java.nio.file.Path;
 5import java.nio.file.Paths;
 6
 7/**
 8 * Java Files write file example
 9 * 
10 * @author pankaj
11 *
12 */
13public class FilesWriteFileExample {
14
15    public static void main(String[] args) {
16    	Path path = Paths.get("D:/data/test.txt");
17    	try {
18    		String str = "This is write file Example";
19    		byte[] bs = str.getBytes();
20    		Path writtenFilePath = Files.write(path, bs);
21    		System.out.println("Written content in file:\n"+ new String(Files.readAllBytes(writtenFilePath)));
22    	} catch (Exception e) {
23    		e.printStackTrace();
24    	}
25
26    }
27
28}

步行档案树

文件类提供 **walkFileTree(Path start, FileVisitor<? Super Path> visitor)**方法,用于穿过目录。

 1package com.journaldev.examples;
 2
 3import java.io.IOException;
 4import java.nio.file.FileVisitResult;
 5import java.nio.file.FileVisitor;
 6import java.nio.file.Files;
 7import java.nio.file.Path;
 8import java.nio.file.Paths;
 9import java.nio.file.attribute.BasicFileAttributes;
10
11/**
12 * Java Files walk file tree example
13 * 
14 * @author pankaj
15 *
16 */
17public class FilesWalkFileTreeExample {
18
19    public static void main(String[] args) {
20    	Path path = Paths.get("D:/pankaj");
21    	try {
22    		Files.walkFileTree(path, new FileVisitor<Path>() {
23
24    			@Override
25    			public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
26    				System.out.println("Post Visit Directory: "+dir);
27    				return FileVisitResult.CONTINUE;
28    			}
29
30    			@Override
31    			public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
32    				System.out.println("Pre Visit Directory: "+dir);
33    				return FileVisitResult.CONTINUE;
34    			}
35
36    			@Override
37    			public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
38    				System.out.println("Visit File: "+file);
39    				return FileVisitResult.CONTINUE;
40    			}
41
42    			@Override
43    			public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
44    				System.out.println("Visit Failed File: "+file);
45    				return FileVisitResult.CONTINUE;
46    			}
47    		});
48    	} catch (Exception e) {
49    		e.printStackTrace();
50    	}
51
52    }
53
54}

上面的项目结果如下:

 1Pre Visit Directory: D:\pankaj
 2Pre Visit Directory: D:\pankaj\java6
 3Pre Visit Directory: D:\pankaj\java6\Files
 4Visit File: D:\pankaj\java6\Files\file.txt.txt
 5Post Visit Directory: D:\pankaj\java6\Files
 6Post Visit Directory: D:\pankaj\java6
 7Pre Visit Directory: D:\pankaj\java7
 8Pre Visit Directory: D:\pankaj\java7\Files
 9Visit File: D:\pankaj\java7\Files\file.txt.txt
10Post Visit Directory: D:\pankaj\java7\Files
11Post Visit Directory: D:\pankaj\java7
12Pre Visit Directory: D:\pankaj\java8
13Pre Visit Directory: D:\pankaj\java8\Files
14Visit File: D:\pankaj\java8\Files\file.txt.txt
15Post Visit Directory: D:\pankaj\java8\Files
16Post Visit Directory: D:\pankaj\java8
17Post Visit Directory: D:\pankaj

请注意,所有文件和文件夹都被重复处理,这非常有用,当你想对所有文件进行一些常见的处理时,例如重复命名一个目录中的所有文件。

Published At
Categories with 技术
Tagged with
comments powered by Disqus