1. 创建文件和目录
1.1 创建文件
Files.createFile()
方法用于创建一个新文件。如果文件已经存在,会抛出 FileAlreadyExistsException
。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CreateFileExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try {
Files.createFile(path);
System.out.println("File created successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.2 创建目录
Files.createDirectory()
用于创建一个新目录。如果目录已存在,会抛出 FileAlreadyExistsException
。
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 path = Paths.get("new_directory");
try {
Files.createDirectory(path);
System.out.println("Directory created successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.3 创建多层目录
Files.createDirectories()
用于创建多层目录,如果父目录不存在,它会递归地创建这些目录。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class CreateDirectoriesExample {
public static void main(String[] args) {
Path path = Paths.get("new_directory/sub_directory");
try {
Files.createDirectories(path);
System.out.println("Directories created successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. 读取文件
2.1 读取整个文件的内容为 byte[]
Files.readAllBytes()
方法用于读取整个文件内容,并将其作为字节数组返回。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class ReadAllBytesExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try {
byte[] bytes = Files.readAllBytes(path);
System.out.println(new String(bytes));
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.2 读取整个文件的内容为 List<String>
Files.readAllLines()
方法用于将整个文件内容读取为一个 List<String>
,每一行作为列表中的一个元素。
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 ReadAllLinesExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try {
List<String> lines = Files.readAllLines(path);
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.3 使用流读取文件
Files.lines()
方法用于将文件的每一行作为 Stream<String>
返回,这种方式非常适合处理大文件,因为它不会一次性将文件全部加载到内存中。
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 FilesLinesExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. 写入文件
3.1 将字节数组写入文件
Files.write()
方法可以将字节数组写入文件。如果文件不存在,它会创建文件。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class WriteBytesExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
String content = "Hello, Files.write!";
try {
Files.write(path, content.getBytes());
System.out.println("File written successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
3.2 将 List<String>
写入文件
Files.write()
也可以将一个字符串列表写入文件,每个字符串作为文件中的一行。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
public class WriteLinesExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
List<String> lines = Arrays.asList("First line", "Second line", "Third line");
try {
Files.write(path, lines);
System.out.println("File written successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. 文件的复制、移动和删除
4.1 复制文件
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 sourcePath = Paths.get("example.txt");
Path destinationPath = Paths.get("copy_example.txt");
try {
Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);
System.out.println("File copied successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.2 移动或重命名文件
Files.move()
方法用于移动或重命名文件。如果目标文件已存在,同样可以通过 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 MoveFileExample {
public static void main(String[] args) {
Path sourcePath = Paths.get("example.txt");
Path destinationPath = Paths.get("moved_example.txt");
try {
Files.move(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);
System.out.println("File moved successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.3 删除文件或目录
Files.delete()
方法用于删除文件或空目录。如果文件或目录不存在,会抛出 NoSuchFileException
。使用 Files.deleteIfExists()
可以避免抛出异常,如果文件或目录不存在,它将返回 false
。
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("moved_example.txt");
try {
Files.delete(path);
System.out.println("File deleted successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
5. 检查文件或目录的属性
5.1 检查文件或目录是否存在
Files.exists()
方法用于检查文件或目录是否存在。Files.notExists()
方法用于检查文件或目录是否不存在。
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("example.txt");
if (Files.exists(path)) {
System.out.println("File exists.");
} else {
System.out.println("File does not exist.");
}
}
}
5.2 检查是否是文件或目录
Files.isRegularFile()
检查路径是否是一个常规文件。Files.isDirectory()
检查路径是否是一个目录。
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class FileTypeCheckExample {
public static void main(String[] args) {
Path filePath = Paths.get("example.txt");
Path dirPath = Paths.get("new_directory");
if (Files.isRegularFile(filePath)) {
System.out.println("It's a regular file.");
}
if (Files.isDirectory(dirPath)) {
System.out.println("It's a directory.");
}
}
}
6. 读取和设置文件属性
6.1 读取文件的基本属性
Files.readAttributes()
方法可以一次性读取文件的多个属性
,例如大小、创建时间、最后修改时间等。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
public class ReadFileAttributesExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try {
BasicFileAttributes attrs = Files.readAttributes(path, BasicFileAttributes.class);
System.out.println("Creation Time: " + attrs.creationTime());
System.out.println("Last Modified Time: " + attrs.lastModifiedTime());
System.out.println("Size: " + attrs.size() + " bytes");
} catch (IOException e) {
e.printStackTrace();
}
}
}
6.2 修改文件的时间属性
Files.setLastModifiedTime()
方法用于设置文件的最后修改时间。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileTime;
import java.util.concurrent.TimeUnit;
public class SetFileTimeExample {
public static void main(String[] args) {
Path path = Paths.get("example.txt");
try {
FileTime fileTime = FileTime.from(1623840362, TimeUnit.SECONDS);
Files.setLastModifiedTime(path, fileTime);
System.out.println("Last modified time updated successfully!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
7. 遍历目录
7.1 使用 Files.walk()
遍历目录
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 path = Paths.get("new_directory");
try (Stream<Path> paths = Files.walk(path)) {
paths.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
7.2 使用 Files.list()
列出目录内容
Files.list()
方法返回指定目录下的文件和目录的流,但不递归遍历子目录。
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 ListDirectoryExample {
public static void main(String[] args) {
Path path = Paths.get("new_directory");
try (Stream<Path> paths = Files.list(path)) {
paths.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
8. 结束语
Files
类提供了丰富且强大的工具方法,使得文件和目录的操作变得更加直观和简洁。无论是创建、读取、写入、复制、删除文件,还是处理文件属性、遍历目录,Files
类都提供了方便易用的API。在现代Java开发中,掌握这些方法能够帮助开发者更加高效地处理I/O操作。
9. 总结
1. `Files.exists(Path)`:检查指定路径是否存在文件或目录。
Files.createFile(Path)
:创建一个新文件。Files.createDirectory(Path)
:创建一个新目录。Files.copy(Path source, Path target)
:将一个文件或目录从源路径复制到目标路径。Files.move(Path source, Path target)
:移动一个文件或目录从源路径到目标路径。Files.delete(Path)
:删除指定路径的文件或目录。Files.readAllBytes(Path)
:读取指定路径的文件的所有字节。Files.readAllLines(Path)
:按行读取指定路径的文件。Files.write(Path, byte[])
:将字节数组写入指定路径的文件。Files.write(Path, Iterable<CharSequence>)
:将字符串集合按行写入指定路径的文件。Files.size(Path)
:返回指定路径的文件的大小。Files.isDirectory(Path)
:检查指定路径是否为目录。Files.isRegularFile(Path)
:检查指定路径是否为常规文件。Files.isHidden(Path)
:检查指定路径是否为隐藏文件。Files.getLastModifiedTime(Path)
:获取指定路径文件的最后修改时间。