Java Files 类是在 Java 1.7 中引入的,是java.nio.file
包的一部分。
Java 文件类
- Java Files 类包含处理文件和目录的静态方法。
- 此类用于基本文件操作,如创建、读取、写入、复制和删除文件系统的文件或目录。
在继续之前,让我们先看看以下术语:
Path
:这是java.io.File
我们在Java NIO中工作时代替class作为文件或目录的表示的接口。- Paths:这个类包含一个静态方法来创建
Path
实例。
java.nio.file.Path
接口就像旧java.io.File
类。Path
表示文件的位置,当我们创建新文件的路径时,它不会创建实际文件,直到我们使用Files.createFile(Path filePath)
.
正如我们在上图中看到的,Paths 类用于创建 Path 的实例,Files 类使用 Path 实例来处理文件。
文件和Path
对象知道如何相互转换,这就是我们如何使用旧代码与新文件实用程序交互的方式。
Java IO 与 NIO
如何创建路径
我们可以Path
通过调用类的Paths.get(String first, String... more)
方法来创建一个对象Paths
。
Path path1 = Paths.get("/tmp/file.txt"); // For UNIX
Path path2 = Paths.get("D:/data/file.txt"); // For Windows
我们还可以Path
通过在Paths.get()
方法中分离部分路径来创建一个对象。
Path path1 = Paths.get("/tmp", "file.txt");
Path path2 = Paths.get("D:", "data", "file.txt");
Path path3 = Paths.get("D:/data", "file.txt") ;
如我们所见,我们可以在Paths.get()
方法中分别传递文件夹和文件名。
Java 文件方法
Java NIO Files 类包含用于操作文件和目录的静态方法,这些方法主要作用于Path
对象。
让我们来看看 Files 类的以下方法:
-
copy(InputStream in, Path target, CopyOption… options):此方法将指定输入流中的所有字节复制到指定目标文件,并返回读取或写入的字节数作为长值。
-
copy(Path source, OutputStream out):此方法将指定源文件中的所有字节复制到给定的输出流,并返回读取或写入的字节数作为长值。
-
copy(Path source, Path target, CopyOption... options):此方法将给定的源文件复制到指定的目标文件,并返回目标文件的路径。
-
createDirectories(Path dir, FileAttribute<?>... attrs):此方法通过首先创建所有不存在的父目录来使用给定路径创建目录。如果由于目录已存在而无法创建该目录,则此方法不会引发异常。FileAttribute 是在创建不存在的目录时自动设置的可选参数,它返回创建的目录的路径。
-
createDirectory(Path dir, FileAttribute<?>... attrs):此方法使用给定的路径创建目录,如果创建目录成功,它将返回创建的目录的路径。如果目录已经存在,那么它会抛出nio.file.FileAlreadyExistsException。
-
createFile(Path path, FileAttribute<?>... attrs):此方法使用给定的路径创建一个新的空文件,如果创建成功,则返回新创建的文件的路径。如果文件已经存在,那么它会抛出nio.file.FileAlreadyExistsException。
-
createTempDirectory(Path dir, String prefix, FileAttribute<?>... attrs):此方法使用给定的路径创建一个临时目录,它将使用给定的前缀生成目录的名称。它将返回新创建的临时目录的路径。
-
createTempDirectory(String prefix, FileAttribute<?>... attrs):此方法在默认临时文件目录中创建一个临时目录,并使用给定的前缀生成目录名称。它将返回与默认文件系统关联的新创建的临时目录的路径。
-
createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>... attrs):此方法在指定目录创建一个临时文件,并使用给定的前缀和后缀生成文件名,并返回新创建文件的路径。
-
createTempFile(String prefix, String suffix, FileAttribute<?>... attrs):此方法在默认临时文件目录中创建一个临时文件,并使用给定的前缀和后缀生成文件名,并返回新创建文件的路径。
-
delete(Path path):这是一个void方法,只是从指定的路径中删除文件。如果文件在指定路径不存在,并且文件是目录并且它可能不为空且无法删除,则此方法抛出NoSuchFileException,在这种情况下它会抛出
-
deleteIfExists(Path path):这个方法在删除文件之前检查文件是否存在,如果给定路径上的文件被成功删除,则返回布尔值真,如果给定路径上不存在文件,则返回假。如果文件是目录并且它可能不是空的并且不能被删除,在这种情况下它会抛出
-
存在(路径路径):此方法检查文件是否存在于指定路径,如果文件存在则返回true,否则返回false。
-
getLastModifiedTime(Path path, Linkoption... options):此方法从给定路径返回文件的最后修改时间为
-
getOwner(Path path, Linkoption... options):此方法返回UserPrincipal表示给定路径中文件的所有者。
-
isDirectory(Path path, Linkoption... options):此方法检查文件是否是给定路径中的目录。如果文件是目录,则返回 true,如果文件不存在或不是目录,或者无法确定文件是否是目录,则返回 false。
-
isExecutable(Path path):此方法检查给定路径上的文件是否可执行,它还检查该文件是否存在以及此 JVM 是否具有执行该文件的适当权限。如果文件在给定路径中存在且可执行,则返回真,如果文件不存在或 JVM 没有足够的权限来执行文件或无法确定访问权限,则返回假。
-
isHidden(Path path):这个方法告诉给定的文件是否被认为是隐藏的。隐藏的确切定义取决于平台或提供商。在 UNIX 系统的情况下,如果文件名以句点字符('.')开头,则文件被认为是隐藏的,而在 WINDOWS 系统中,如果它不是目录并且设置了 DOS 隐藏属性,则文件被认为是隐藏的。如果给定路径上的文件被认为是隐藏的,则返回 true,否则返回 false。
-
isReadable(Path path):此方法测试给定路径下的文件是否可读。如果指定路径中的文件存在且可读,则重新运行为真,如果文件不存在或读取访问被拒绝,则为假,因为 JVM 没有足够的权限或无法确定访问权限。
-
isWritable(Path path):此方法测试给定路径的文件是否可写。如果指定路径中的文件存在且可写,则重新运行 true,如果文件不存在或由于 JVM 没有足够的权限或无法确定访问权限而拒绝写入访问,则返回 false。
-
move(Path source, Path target, CopyOption... options):
此方法将源文件移动或重命名为目标文件,并返回目标文件的路径。选项参数可能包括以下内容:
REPLACE_EXISTING:
这意味着如果目标文件存在,则如果它不是非空目录,则替换它。
ATOMIC_MOVE:表示移动作为原子文件系统操作执行,所有其他选项都被忽略。
如果目标文件存在但由于未指定REPLACE_EXISTING选项而无法替换,则此方法将引发FileAleadyExistsException。
如果指定了REPlACE_EXISTING选项,则此方法将引发DirectoryNotEmptyException但无法替换该文件,因为它是一个非空目录。
-
newBufferedReader(Path path, Charset cs):此方法通过返回用于从文件读取文本的 BufferedReader 来使用给定的读取路径打开文件。使用指定的字符集将文件中的字节解码为字符。
-
newBufferedWriter(Path path, Charset cs, Openoption... options):此方法通过返回用于将文本写入文件的 BufferedWriter 来使用给定的写入路径打开或创建文件。options 参数指定如何创建或打开文件。如果未指定选项,则默认情况下会考虑CREATE、TRUNCATE_EXISTING和WRITE选项,这意味着它会打开文件进行写入并在文件不存在时创建,如果存在则将现有文件截断为 0 大小。如果指定了不受支持的选项,则此方法将引发UnsupportedOperationException。
-
newByteChannel(Path path, OpenOption... options):此方法通过返回一个可搜索的字节通道来访问文件,从而使用指定的路径创建或打开文件。如果指定了不受支持的选项,则此方法将引发UnsupportedOperationException。
-
newDirectoryStream(Path path):此方法通过返回 DirectoryStream 来从指定路径迭代目录中的所有条目来打开一个目录。DirectoryStream 的迭代器返回的元素是 Path 类型,每个元素代表目录中的一个条目。如果给定路径中的文件不是目录而无法打开,则此方法将引发NotDirectoryException。
-
newDirectoryStream(Path path, Filter<? super Path > filter):这个方法通过返回一个 DirectoryStream 来从指定路径迭代目录中的所有条目来打开一个目录。DirectoryStream 的迭代器返回的元素是 Path 类型,每个元素代表目录中的一个条目,这些条目由指定的过滤器过滤。如果给定路径中的文件不是目录而无法打开,则此方法将引发NotDirectoryException。
-
newDirectoryStream(Path path, String glob):此方法通过返回 DirectoryStream 以迭代指定路径中目录中的所有条目来打开目录。DirectoryStream 的迭代器返回的元素是 Path 类型,每个元素代表目录中的一个条目,这些条目通过将其文件名的字符串表示与指定的通配模式匹配来过滤。如果给定路径上的文件不是目录而无法打开,则此方法将引发NotDirectoryException;如果模式无效,则此方法将引发PatternSyntaxException。
-
newInputStream(Path path, Openoption... options):此方法通过返回输入流从指定路径读取文件来打开文件。options 参数确定文件的打开方式,如果未指定任何选项,则使用READ打开文件。如果指定了无效的选项组合,则此方法抛出IllegalArgumentException,如果指定了不受支持的选项,则抛出 UnsupportedOperationException。
-
newOutputStream(Path path, Openoption... options):此方法通过返回输出流将字节写入指定路径的文件来打开文件。options 参数决定文件的打开方式,如果未指定选项,则默认情况下会考虑CREATE、TRUNCATE_EXISTING和WRITE选项,这意味着它会打开文件进行写入并在文件不存在时创建或将现有文件截断为大小如果存在,则为 0。如果指定了无效的选项组合,则此方法将引发IllegalArgumentException;如果指定了不受支持的选项,则此方法将引发UnsupportedOperationException。
-
notExists(Path path, LinkOption options):该方法测试指定路径的文件是否不存在。options 参数用于指示如果文件是符号链接,则如何处理符号链接。默认情况下,遵循符号链接。如果选项NOFOLLOW_LINK存在,则不遵循符号链接。如果文件在指定路径不存在,则此方法返回 true,如果文件存在或无法确定其存在,则返回 false。
-
readAllBytes(Path path):此方法从给定路径的文件中读取所有字节,并返回包含从文件中读取的字节的字节数组。
-
readAllLines(Path path, Charset cs):此方法从给定路径的文件中读取所有行,并返回包含文件行的列表
-
size(Path path):此方法以字节为单位返回指定路径上文件的大小。
-
walkFileTree(Path start, FileVisitor<?Super Path>visitor):这个方法用来遍历目录。它递归遍历指定路径的目录并返回起始文件。
-
write(Path path, byte[] bytes, OpenOption... options):此方法将字节写入指定路径的文件。options 参数指定如何创建或打开文件。如果未指定选项,则默认情况下会考虑CREATE、TRUNCATE_EXISTING和WRITE选项,这意味着它会打开文件进行写入并在文件不存在时创建,如果存在则将现有文件截断为 0 大小。字节数组中的所有字节都写入文件。此方法确保在写入所有字节后关闭文件并返回写入文件的路径。
使用 Files 类创建文件
Files 类提供了createFile(Path filePath, FileAttribute<?>… attrs)
使用指定的Path
.
让我们看看下面的示例程序。
package com.journaldev.examples;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Java Create file using Files class
*
* @author pankaj
*
*/
public class FilesCreateFileExample {
public static void main(String[] args) {
//initialize Path object
Path path = Paths.get("D:/data/file.txt");
//create file
try {
Path createdFilePath = Files.createFile(path);
System.out.println("File Created at Path : "+createdFilePath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述程序的输出如下:
File Created at Path : D:\data\file.txt
使用 Files 类创建目录
文件类提供createDirectory(Path dir, FileAttribute<?>… attrs)
和createDirectories(Path dir, FileAttribute<?>… attrs)
方法来创建使用指定的单一和多级目录Path
。
让我们看看下面的示例程序。
package com.journaldev.examples;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Java Create directories using Files class
*
* @author pankaj
*
*/
public class FilesCreateDirectoriesExample {
public static void main(String[] args) {
// initialize Path objects
Path path1 = Paths.get("D:/pankaj");
Path path2 = Paths.get("D:/pankaj/java7");
Path path3 = Paths.get("D:/pankaj/java7/Files");
try {
Path createdDir1 = Files.createDirectory(path1);//first level directory
Path createdDir2 = Files.createDirectory(path2);//second level directory
Path createdDir3 = Files.createDirectory(path3);//all level directories
System.out.println("First Level Directory Created at Path : "+createdDir1);
System.out.println("Second Level Directory Created at Path : "+createdDir2);
System.out.println("All Level Directories Created at Path : "+createdDir3);
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述程序的输出如下:
First Level Directory Created at Path : D:\pankaj
Second Level Directory Created at Path : D:\pankaj\java7
All Level Directories Created at Path : D:\pankaj\java7\Files
将文件转换为路径,反之亦然
File 和 Path 对象可以使用以下方法相互转换:
File file = new File(“D:/data/file.txt”);
Path path = file.toPath();
File file1 = path.toFile();
使用 Files 类读取文件数据
Files 类提供了以下读取文件的方法。
readAllBytes(Path path)
:此方法从给定路径的文件中读取所有字节,并返回包含从文件中读取的字节的字节数组。readAllLines(Path path,Charsetcs)
:此方法从给定路径的文件中读取所有行,并返回包含文件中行的列表。
让我们看看下面的示例程序。
package com.journaldev.examples;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
/**
* Java Files read file example
*
* @author pankaj
*
*/
public class FilesReadFileExample {
public static void main(String[] args) {
Path path = Paths.get("D:/data/file.txt");
try {
byte[] bs = Files.readAllBytes(path);
List<String> strings = Files.readAllLines(path);
System.out.println("Read bytes: \n"+new String(bs));
System.out.println("Read lines: \n"+strings);
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述程序的输出如下:
Read bytes:
Hello world
This is Read file example
Thank you
Read lines:
[Hello world, This is Read file example, Thank you]
使用 Files 类复制文件
Files 类提供copy(Path source, Path target, CopyOption… options)
将给定源文件复制到指定目标文件并返回目标文件路径的方法。
让我们看看下面的示例程序:
package com.journaldev.examples;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOption;
/**
* Java Files copy file example
*
* @author pankaj
*
*/
public class FilesFileExample {
public static void main(String[] args) {
Path sourcePath = Paths.get("D:/data/sourceFile.txt");
Path targetPath = Paths.get("D:/data/targetFile.txt");
try {
Path path = Files.copy(sourcePath, targetPath,StandardOption.REPLACE_EXISTING);//copy with REPLACE_EXISTING option
System.out.println("Target file Path : "+path);
System.out.println("Copied Content : \n"+new String(Files.readAllBytes(path)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述程序的输出如下:
Target file Path : D:\data\targetFile.txt
Copied Content :
Hello world
This is file example
Thank you
使用 Files 类移动文件
Java Files 类提供move(Path source, Path target, CopyOption… options)
将源文件移动或重命名为目标文件的方法,并返回目标文件的路径。
选项参数可能包括以下内容:
REPLACE_EXISTING:表示如果目标文件存在,则如果它不是非空目录,则替换它。
ATOMIC_MOVE:表示移动作为原子文件系统操作执行,所有其他选项都被忽略。
FileAleadyExistsException
如果目标文件存在但由于未指定REPLACE_EXISTING选项而无法替换,则此方法将引发。
DirectoryNotEmptyException
如果指定了REPlACE_EXISTING选项但无法替换文件,因为它是非空目录,则此方法将引发。
让我们看看下面的示例程序:
package com.journaldev.examples;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOption;
/**
* Java Files move file example
*
* @author pankaj
*
*/
public class FilesMoveFileExample {
public static void main(String[] args) {
Path sourcePath = Paths.get("D:/data/sourceFile.txt");
Path targetPath = Paths.get("D:/data/targetFile.txt");
try {
Path path = Files.move(sourcePath, targetPath,StandardOption.REPLACE_EXISTING);//move with REPLACE_EXISTING option
System.out.println("Target file Path : "+path);
System.out.println("Moved Content : \n"+new String(Files.readAllBytes(path)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 Files 类写入文件
Java NIO Files 类提供write(Path path, byte[] bytes, OpenOption… options)
了将字节写入指定路径的文件的方法。
options 参数指定如何创建或打开文件。如果未指定选项,则默认情况下会考虑CREATE、TRUNCATE_EXISTING和WRITE选项。这意味着它会打开文件进行写入并在文件不存在时创建或将现有文件截断为 0(如果存在)。
字节数组中的所有字节都写入文件。此方法确保在写入所有字节后关闭文件并返回写入文件的路径。
package com.journaldev.examples;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Java Files write file example
*
* @author pankaj
*
*/
public class FilesWriteFileExample {
public static void main(String[] args) {
Path path = Paths.get("D:/data/test.txt");
try {
String str = "This is write file Example";
byte[] bs = str.getBytes();
Path writtenFilePath = Files.write(path, bs);
System.out.println("Written content in file:\n"+ new String(Files.readAllBytes(writtenFilePath)));
} catch (Exception e) {
e.printStackTrace();
}
}
}
walkFileTree
Files 类提供了用于遍历目录的walkFileTree(Path start, FileVisitor<? Super Path>visitor)方法。它递归遍历指定路径的目录并返回起始文件。
package com.journaldev.examples;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
/**
* Java Files walk file tree example
*
* @author pankaj
*
*/
public class FilesWalkFileTreeExample {
public static void main(String[] args) {
Path path = Paths.get("D:/pankaj");
try {
Files.walkFileTree(path, new FileVisitor<Path>() {
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("Post Visit Directory: "+dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("Pre Visit Directory: "+dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("Visit File: "+file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
System.out.println("Visit Failed File: "+file);
return FileVisitResult.CONTINUE;
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
上述程序的输出如下:
Pre Visit Directory: D:\pankaj
Pre Visit Directory: D:\pankaj\java6
Pre Visit Directory: D:\pankaj\java6\Files
Visit File: D:\pankaj\java6\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java6\Files
Post Visit Directory: D:\pankaj\java6
Pre Visit Directory: D:\pankaj\java7
Pre Visit Directory: D:\pankaj\java7\Files
Visit File: D:\pankaj\java7\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java7\Files
Post Visit Directory: D:\pankaj\java7
Pre Visit Directory: D:\pankaj\java8
Pre Visit Directory: D:\pankaj\java8\Files
Visit File: D:\pankaj\java8\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java8\Files
Post Visit Directory: D:\pankaj\java8
Post Visit Directory: D:\pankaj
请注意,所有文件和文件夹都是递归处理的。当您想对所有文件进行一些通用处理时,这非常有用,例如递归重命名目录中的所有文件。
这就是 Java Files 类的全部内容。