当前位置: 首页 > news >正文

java NIO中的FileSystems工具类可以读取本地文件系统,ZIP/JAR等,无需解压处理,还可以复制文件

在Java NIO(java.nio.file包)中,FileSystems 是一个工具类,用于操作和管理文件系统。它提供了静态方法来获取或创建文件系统实例,并支持自定义文件系统实现。以下是其核心功能和用法:


1. 核心功能

(1) 获取默认文件系统

获取当前运行环境的默认文件系统(如本地文件系统):

FileSystem fileSystem = FileSystems.getDefault();
(2) 创建新的文件系统

通过 newFileSystem() 方法可以创建新的文件系统实例,例如:

  • 从 ZIP 文件创建

    import java.nio.file.*;
    import java.util.Map;
    
    Path zipPath = Paths.get("archive.zip");
    FileSystem zipFS = FileSystems.newFileSystem(zipPath, (ClassLoader) null);
    // 使用 zipFS 访问 ZIP 文件内的路径
    
  • 从自定义提供者(Provider)创建
    若有自定义的 FileSystemProvider,可通过参数指定:

    FileSystem customFS = FileSystems.newFileSystem(uri, env, provider);
    
(3) 获取文件系统提供者

通过 URI 或方案(如 file://jar://)获取对应的文件系统提供者:

FileSystemProvider provider = FileSystems.getDefaultProvider();
// 或通过 URI 获取特定提供者
provider = FileSystems.getProvider(URI.create("jar:file:/path/to/file.jar"));

2. 主要方法

方法作用
getDefault()获取当前 JVM 的默认文件系统。
newFileSystem(Path, Map, ClassLoader)从路径创建新的文件系统(如 ZIP)。
newFileSystem(URI, Map, ClassLoader)从 URI 创建新的文件系统。
getProvider(String scheme)根据方案(如 filejar)获取提供者。
getFileSystem(URI)根据 URI 获取已存在的文件系统。

3. 使用场景

(1) 处理 ZIP/JAR 文件

通过 FileSystems 可以直接操作 ZIP 或 JAR 文件内的内容,无需先解压:

try (FileSystem zipFS = FileSystems.newFileSystem(zipPath, (ClassLoader)null)) {
    Path innerFile = zipFS.getPath("inner/file.txt");
    // 读取或写入 ZIP 内的文件
}
(2) 跨平台兼容

在不同操作系统(Windows/Linux/macOS)中,路径分隔符(\\ vs /)可能不同,FileSystems 可以通过 getPath() 方法自动处理:

Path path = FileSystems.getDefault().getPath("dir", "file.txt");
// 自动转换为系统对应的路径格式(如 "dir\\file.txt" 或 "dir/file.txt")
(3) 自定义文件系统

通过实现 FileSystemProvider 接口,可以创建自定义文件系统(如基于网络或加密的文件系统),并通过 FileSystems 管理。


4. 与 Paths 的关系

Paths 类是 FileSystems 的简化封装:

// Paths.get() 的底层实现
Path path = Paths.get("file.txt"); 
// 等价于
Path path = FileSystems.getDefault().getPath("file.txt");

总结

  • FileSystems 是 Java NIO 中管理文件系统的核心工具类,提供对默认文件系统、自定义文件系统以及文件系统提供者的操作。
  • 适用场景:处理 ZIP/JAR 文件、跨平台路径操作、自定义文件系统(如网络文件系统)。
  • 推荐用法:通过 Paths.get() 快速获取 Path,复杂场景(如 ZIP 内容操作)则直接使用 FileSystems

相关文章:

  • JVM逃逸分析作用和原理
  • 打破煤矿通信屏障,无线系统赋能生产安全与智能进阶
  • 微服务》》Kubernetes (K8S) 集群 安装
  • Linux 告警:使用企业微信发送通知
  • 【玩转全栈】---- Django 基于 Websocket 实现群聊(解决channel连接不了)
  • 目标和 (leetcode 494
  • 解决SpringCloud整合Nacos启动报Client not connected, current status:STARTING
  • [C++面试] 迭代器面试点(难点)
  • 一个KADB测试实践
  • Leetcode 378. 有序矩阵中第 K 小的元素 二分查找
  • gonet开源游戏服务器环境配置
  • leetcode127.单词接龙
  • 在 Linux下使用 Python 3.11 和 FastAPI 搭建带免费证书的 HTTPS 服务器
  • HarmonyOS开发,A持有B,B引用A的场景会不会导致内存泄漏,看这里!
  • python|exm6-1try-except结构|raise关键字|异常类型
  • Cannot find module @rollup/rollup-win32-x64-msvc
  • AES 简介 以及 C# 和 js 实现【加密知多少系列_3】
  • 鸿蒙Next开发与未来发展的变革:全场景操作系统的全新纪元
  • UE4学习笔记 FPS游戏制作10 制作UI准星
  • Linux 修改国内镜像源
  • 4月证券私募产品备案量创23个月新高,股票策略占比超六成
  • 沃旭能源因成本上升放弃英国海上风电项目,或损失近40亿元
  • 最快3天开通一条定制公交线路!上海推出服务平台更快响应市民需求
  • 北京:下调个人住房公积金贷款利率
  • 花20万骑自行车?CityRide带火“骑行经济”
  • 外交部:解放军参加红场阅兵体现了中方对历史的尊重和铭记