检查文件和文件夹

要检查文件是否存在,我们使用 exists API:

  1. Path path = Paths.get("D:/temp/test/test1");
  2. System.out.println(Files.exists(path));

我们还可以检查一个文件是像 myfile.txt 这样的普通文件还是只是一个目录,我们使用 isRegularFile API:

  1. Path path = Paths.get("D:/temp/");
  2. System.out.println(Files.isRegularFile(path));

还有检查文件是否可读、可写、可执行,这里不一一举例了。

创建文件和文件夹

创建文件夹

  1. try {
  2. Path path = Paths.get("D:/temp/test");
  3. Files.createDirectory(path);
  4. } catch (IOException e) {
  5. e.printStackTrace();
  6. }

创建多级文件夹

  1. try {
  2. Path path = Paths.get("D:/temp/test/test1");
  3. Files.createDirectories(path);
  4. } catch (IOException e) {
  5. e.printStackTrace();
  6. }

创建文件

为了防止文件夹不存在,先要创建文件夹,再创建文件。

  1. try {
  2. Path path = Paths.get("D:/temp/test1/test.txt");
  3. Path parent = path.getParent();
  4. if (!Files.exists(parent)) {
  5. Files.createDirectories(parent);
  6. }
  7. Files.createFile(path);
  8. } catch (IOException e) {
  9. e.printStackTrace();
  10. }

创建临时文件

在本地文件系统生成一个文件,不需要指定文件名称。

  1. try {
  2. String prefix = "log_";
  3. String suffix = ".txt";
  4. Path p = Paths.get("D:/temp");
  5. Files.createTempFile(p, prefix, suffix);
  6. } catch (IOException e) {
  7. e.printStackTrace();
  8. }

p 给定创建临时文件路径;
prefix,suffix 可以为空字符串,分别指定文件名前缀、后缀。

读写文件

读取文本

  1. // 一次按行读取文件所有内容
  2. List<String> lines = Files.readAllLines(path);

写入文本

  1. /* 一次写所有文件内容 */
  2. // 写一个字符串到文件
  3. Files.write(path, content.getBytes(charset));
  4. // 追加字符串到文件
  5. Files.write(path, content.getBytes(charset), StandardOpenOption.APPEND);
  6. // 写一个行的集合到文件
  7. List<String> lines = new ArrayList<String>();
  8. Files.write(path, lines);

处理大文件

要处理大文件和二进制文件,需要用到输入流/输出流,或者使用读入器/写入器。

  1. InputStream in = Files.newInputStream(path);
  2. OutputStream out = Files.newOutputStream();
  3. Reader reader = Files.newBufferedReader(path, charset);
  4. Writer writer = Writer.newBufferedWriter(path, charset);

访问目录各项

遍历指定目录下各项

Files.list 会返回Stream,而且是惰性读取,处理目录具有大量项时高效。不过,list 不会进入子目录,进入子目录使用 walk。

  1. // 读取目录涉及需要关闭系统资源, 使用try块. 不进入子目录
  2. try(Stream<Path> entries = Files.list(dirPath)) {
  3. // 打印每个entries项, 也就是打印每个path
  4. entries.forEach(System.out::println);
  5. }
  6. // 会进入子目录
  7. try(Stream<Path> entries = Files.walk(dirPath)) {
  8. entries.forEach(System.out.println);
  9. }