当前位置:首页 > 工具 > 正文内容

Java NIO 文件操作详解:FileChannel、Path 与 Files 工具类

访客 工具 2026年9月15日 12

FileChannel 基础操作

FileChannel 是 Java NIO 中用于高效读写文件的通道,仅支持阻塞模式。它不能直接实例化,需通过 FileInputStream、FileOutputStream 或 RandomAccessFile 的 getChannel() 方法获取:

  • 从 FileInputStream 获取的通道仅可读;
  • 从 FileOutputStream 获取的通道仅可写;
  • RandomAccessFile 的通道读写能力取决于其构造时指定的模式(如 "r" 或 "rw")。

读取数据:调用 channel.read(buffer) 将数据填充到 ByteBuffer,返回实际读取的字节数,-1 表示到达文件末尾。

写入数据:需先将数据写入缓冲区,切换为读模式后循环写入,因为单次 write 调用可能无法写完全部内容:

ByteBuffer buf = ByteBuffer.allocate(1024);
buf.put(data);
buf.flip();
while (buf.hasRemaining()) {
    channel.write(buf);
}

位置与大小:可通过 position() 获取或设置当前读写位置。若设为超出文件末尾的位置再写入,中间会产生空洞(以零填充)。使用 size() 可获取文件总字节数。

强制刷盘:调用 force(true) 可确保文件内容及元数据立即写入磁盘,绕过操作系统缓存。

关闭资源:关闭底层流(如 FileInputStream)会自动关闭关联的 FileChannel。

高效文件传输:transferTo 与 transferFrom

利用 transferTo 可在两个 FileChannel 间直接传输数据,底层通常使用零拷贝技术提升性能:

try (FileChannel src = new FileInputStream("src.txt").getChannel();
     FileChannel dst = new FileOutputStream("dst.txt").getChannel()) {
    long total = src.size();
    for (long pos = 0; pos < total; ) {
        long transferred = src.transferTo(pos, total - pos, dst);
        pos += transferred;
    }
}

该方法适用于大文件传输,即使超过 2GB 也能分段处理。

Path 与路径操作

自 JDK 7 起,Path 接口用于表示文件路径,Paths 是其工厂类:

Path p1 = Paths.get("data.txt");                // 相对路径
Path p2 = Paths.get("C:\\data\\file.txt");      // Windows 绝对路径
Path p3 = Paths.get("/home/user/file.txt");     // Unix 绝对路径
Path p4 = Paths.get("data", "sub", "file.txt"); // 自动拼接路径

使用 normalize() 可解析 . 和 ..,得到规范路径:

Path raw = Paths.get("a/../b");
System.out.println(raw.normalize()); // 输出: b

Files 工具类常用方法

Files 提供了丰富的静态方法用于文件系统操作:

  • 存在性检查:Files.exists(path)
  • 创建目录:
    • createDirectory(path):仅创建单层目录;
    • createDirectories(path):递归创建多级目录。
  • 复制与移动:
    Files.copy(src, tgt, StandardCopyOption.REPLACE_EXISTING);
    Files.move(src, tgt, StandardCopyOption.ATOMIC_MOVE);
  • 删除操作:
    • delete(path):删除文件或空目录;
    • 非空目录需先清空内容再删除。

遍历文件树:使用 walkFileTree 配合 SimpleFileVisitor 可深度遍历目录结构:

Files.walkFileTree(root, new SimpleFileVisitor<>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
        if (file.toString().endsWith(".jar")) {
            jarCount.incrementAndGet();
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
        Files.delete(dir); // 删除空目录
        return FileVisitResult.CONTINUE;
    }
});

批量复制目录:结合 Files.walk() 流式 API 可实现整个目录的复制:

Files.walk(Paths.get(srcDir))
     .forEach(p -> {
         Path targetPath = Paths.get(p.toString().replace(srcDir, destDir));
         try {
             if (Files.isDirectory(p)) {
                 Files.createDirectories(targetPath);
             } else {
                 Files.copy(p, targetPath);
             }
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
     });

注意:此类操作需谨慎处理异常,并确保目标路径不存在冲突。

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

基于ELK的日志集中化分析系统搭建

构建统一日志管理平台的必要性 在分布式架构中,各服务节点独立运行,日志分散存储于不同主机。传统通过命令行工具如grep、awk逐个检索日志的方式,在数据量庞大时效率极低,难以实现快速定位问题。为提升运维效率,需建立集中式日志处理体系,具备日志采集、传输、存储、分析与告警能力。 ELK技术栈核心组件解析 Elasticsearch:分布式搜索引擎,支持全文检索、实时数据分析和高可用集群部署,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。