1、简述
Java NIO (New I/O) 是 Java 提供的一套用于处理高效 I/O 操作的 API,java.nio.file 包引入了一些新特性和工具,使文件操作更加简洁、易用、强大。相比传统的 java.io.File,NIO 提供了更加灵活且高效的文件系统接口。本文将详细介绍 NIO 文件处理相关的 API,并展示一些常见的使用场景。
在 java.nio.file 中,主要用到的类包括:
- Path: 表示文件系统中的路径。它是 java.io.File 类的替代类,提供了更多操作路径的功能。
- Files: 提供了许多静态方法,用于文件的常见操作,如读取、写入、复制、删除等。
- FileSystems: 该类用于获取当前系统的默认文件系统。
2、 常用操作与示例
2.1 创建 Path 对象
Path 类是 java.nio.file 的核心,表示文件系统中的路径。可以通过 Paths.get() 方法来创建 Path 对象。
import java.nio.file.Path;
import java.nio.file.Paths;
public class PathExample {
public static void main(String[] args) {
// 创建一个 Path 对象
Path path = Paths.get("C:/example/file.txt");
// 输出路径信息
System.out.println("Path: " + path);
System.out.println("File Name: " + path.getFileName());
System.out.println("Parent Directory: " + path.getParent());
System.out.println("Root: " + path.getRoot());
}
}
2.2 检查文件或目录是否存在
通过 Files.exists() 方法可以快速检查文件或目录是否存在。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FileExistsExample {
public static void main(String[] args) {
Path path = Paths.get("C:/example/file.txt");
if (Files.exists(path)) {
System.out.println("File exists.");
} else {
System.out.println("File does not exist.");
}
}
}
2.3 创建目录
Files.createDirectory() 和 Files.createDirectories() 可以用来创建目录。如果父目录不存在,createDirectories() 将自动创建它们。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CreateDirectoryExample {
public static void main(String[] args) {
Path dir = Paths.get("C:/example/newDir");
try {
Files.createDirectories(dir);
System.out.println("Directory created.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.4 读取文件内容
通过 Files.readAllLines() 方法可以读取文件的所有行,并将其存储在 List
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class ReadFileExample {
public static void main(String[] args) {
Path path = Paths.get("C:/example/file.txt");
try {
List<String> lines = Files.readAllLines(path);
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.5 写入文件
使用 Files.write() 方法可以将内容写入文件。如果文件不存在,会自动创建。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class WriteFileExample {
public static void main(String[] args) {
Path path = Paths.get("C:/example/file.txt");
String content = "This is an example content.";
try {
Files.write(path, Arrays.asList(content), StandardCharsets.UTF_8);
System.out.println("File written successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.6 文件复制
Files.copy() 可以用来复制文件。目标路径若存在文件,可以通过指定 StandardCopyOption.REPLACE_EXISTING 来覆盖现有文件。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
public class CopyFileExample {
public static void main(String[] args) {
Path source = Paths.get("C:/example/file.txt");
Path destination = Paths.get("C:/example/copy_file.txt");
try {
Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING);
System.out.println("File copied successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.7 删除文件或目录
Files.delete() 可以用来删除文件或目录。如果目录非空,使用 Files.walk() 可以递归删除目录及其内容。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class DeleteFileExample {
public static void main(String[] args) {
Path path = Paths.get("C:/example/file.txt");
try {
Files.delete(path);
System.out.println("File deleted successfully.");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.8 遍历目录
Files.walk() 用于遍历文件夹及其子文件夹。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;
public class WalkDirectoryExample {
public static void main(String[] args) {
Path dir = Paths.get("C:/example");
try (Stream<Path> paths = Files.walk(dir)) {
paths.filter(Files::isRegularFile)
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、NIO 文件处理的优势
相比于传统的 java.io.File,java.nio.file 提供了更高效的文件操作方式,尤其在大文件和并发操作的场景下有显著优势:
- 非阻塞 I/O:支持异步和非阻塞 I/O 操作,提高了文件系统访问的性能。
- 更灵活的路径操作:Path 类提供了丰富的路径操作方法,简化了路径的处理。
- 丰富的文件操作:Files 类提供了读取、写入、复制、移动、删除、遍历等一系列文件操作方法。
4、总结
java.nio.file 提供了现代化的文件系统处理 API,使得文件操作更加简洁、灵活和高效。通过使用 Path 和 Files 类,开发人员可以快速地进行文件的各种操作,如读取、写入、复制、删除、遍历等操作。相比传统的 java.io.File,java.nio.file 提供了更好的性能和更强大的功能,尤其在大规模文件操作和并发场景下表现尤为出色。
这套 API 是现代 Java 应用开发中处理文件系统时的首选。
评论区