侧边栏壁纸
博主头像
拾荒的小海螺博主等级

只有想不到的,没有做不到的

  • 累计撰写 194 篇文章
  • 累计创建 19 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

JAVA:NIO 文件应用的技术指南

拾荒的小海螺
2024-10-06 / 0 评论 / 0 点赞 / 28 阅读 / 7424 字

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: 该类用于获取当前系统的默认文件系统。

1728215095168.jpg

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 应用开发中处理文件系统时的首选。

0

评论区