吉森的技术小站 吉森的技术小站
首页
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

吉森

Fuel your ambition
首页
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Java基础

  • Spring框架

  • 第三方库

    • 11年30个大版本,github4万星!谷歌这款java工具包值得深入学习
    • Hutool——国产良心工具包,让你的java变得更甜
    • Apache Commons VFS——让java访问资源效率超级加倍
      • 统一入口
      • 示例代码
      • 进一步探讨
        • FileObject
        • FileContent
        • 总结
      • 附:各类文件的 URI 格式
        • 1. 本地文件
        • 2. 压缩文件
        • 3. HTTP/HTTPS
        • 4. FTP/FTPS/SFTP
        • 5. Classpath
      • 引入 Commons-VFS
        • 基础依赖
        • 可选依赖
      • 参考资料
    • Java缓存技术哪家强?请找Apache Commons JCS
  • Java
  • 第三方库
吉森
2021-06-02
目录

Apache Commons VFS——让java访问资源效率超级加倍

Apache CommonsVFS虚拟文件系统文件操作HTTPFTPSFTP 0 人阅读

前面分两期介绍了 Apache Commons 工具包的一部分工具,今天继续介绍 Apache Commons 工具包中提高开发效率的一项利器:VFS。

VFS 指虚拟文件系统,不要被这个名字唬住了,它其实就是操作各种来源的文件的一套统一的 API。有了它,我们可以方便地操作本地文件、zip 和 jar 等多种压缩包中的文件、HTTP/FTP 服务器上的文件、临时文件,甚至是内存中的文件。怎么样,是不是跃跃欲试了?

# 统一入口

VFS 工具包中,统一操作各类文件系统的类是 FileSystemManager,想要获取它的实例非常的简单:

FileSystemManager manager = VFS.getManager();
1

有时候,我们为了获取更多的功能,会把它转型成子类:

DefaultFileSystemManager manager = (DefaultFileSystemManager) VFS.getManager();
1

有了 FileSystemManager 的实例,我们就可以开始操作各类文件系统了。

# 示例代码

下面话不多说,让我们先看一些代码示例,来看一下它究竟是怎么操作各类文件系统的:

// 获取文件系统管理器,它是统一API入口
final DefaultFileSystemManager manager = (DefaultFileSystemManager) VFS.getManager();
//        manager.addProvider("http", new HttpFileProvider());
//        manager.addProvider("sftp", new SftpFileProvider());

/* 1. 本地文件,必须是绝对路径 */
final FileObject fileObject = manager.resolveFile("file:///your/path/a.txt");
final FileContent content = fileObject.getContent();

// 读取文件中内容
final String s = content.getString("utf-8");
System.out.println("s = " + s);

// 向文件中写内容
try (OutputStream outputStream = content.getOutputStream(true)) {
    outputStream.write("abcdefg".getBytes());
}

/* 2. 压缩文件,支持zip、jar、tar、gzip和bzip2 */
final FileObject tarFileObject = manager.resolveFile("tar:///your/path/test.tar/!test/a.png");
final FileContent tarContent = tarFileObject.getContent();
tarContent.write(Files.newOutputStream(Paths.get("s.png")));

// 遍历压缩文件的下级文件
final FileObject tarFileObject2 = manager.resolveFile("tar:///your/path/test.tar");
final FileObject[] children = tarFileObject2.getChildren();
for (FileObject child : children) {
    System.out.println(child.getName());
}

/* 3. Http和Https,需要依赖于commons-httpclient */
final FileObject httpFileObject = manager.resolveFile("http://commons.apache.org/proper/commons-vfs/filesystems.html");
final String httpContent = httpFileObject.getContent().getString("utf-8");
System.out.println("httpContent = " + httpContent);

/* 4. Classpath,通常是项目编译生成的target文件夹,或者jar、war等安装包 */
final FileObject classpathFileObject = manager.resolveFile("res://web.properties");
final String string = classpathFileObject.getContent().getString("utf-8");
System.out.println("string = " + string);

/* 5. Ftp、Ftps、Sftp,需要依赖于com.jcraft.jsch*/
FileSystemOptions opts = new FileSystemOptions();
// 不严格检查连接的HostKey
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no");

final FileObject sftpFileObject = manager.resolveFile("sftp://root:{74AF5548271EAAA71716A254F1C46F24}@XXX.XXX.XXX.XXX/ReadMe", opts);
final String sftpContent = sftpFileObject.getContent().getString("utf-8");
System.out.println("string = " + sftpContent);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

# 进一步探讨

通过上述代码,我们可以看出这里面最重要的两个抽象接口是 FileObject 和 FileContent。

# FileObject

FileObject 用于遍历文件的内容或者结构,这些文件是有层次结构的,可以通过一个 FileObject 获取到上级/下级的 FileObject 进行进一步操作。FileObject 可能是文件或文件夹。

# FileContent

FileContent 代表文件的内容,可以通过 getInputStream 获取到输入流读取文件内容,通过 getOutputStream 获取到输出流向文件中写入内容或创建新文件/文件夹。文件同时可以有多个输入流。流用完之后不要忘记关闭哦~

# 总结

敲黑板总结啦:

  • 统一 API:无论是本地文件、压缩包、网络文件,都使用相同的 API 操作
  • 层次结构:文件系统具有层次结构,可以方便地遍历和操作
  • 多种协议支持:支持 file、http、ftp、sftp、zip、jar 等多种协议
  • 流操作:支持输入输出流操作,方便文件读写

VFS总结

# 附:各类文件的 URI 格式

# 1. 本地文件

[file://] 绝对路径
1

# 2. 压缩文件

zip:// 压缩文件URI[! 绝对路径]
jar:// 压缩文件URI[! 绝对路径]
tar:// 压缩文件URI[! 绝对路径]
tgz:// 压缩文件URI[! 绝对路径]
tbz2:// 压缩文件URI[! 绝对路径]
1
2
3
4
5

# 3. HTTP/HTTPS

http://[ 用户名[: 密码]@] 主机名或ip地址[: 端口][ 绝对路径]
https://[ 用户名[: 密码]@] 主机名或ip地址[: 端口][ 绝对路径]
1
2

# 4. FTP/FTPS/SFTP

ftp://[ 用户名[: 密码]@] 主机名或ip地址[: 端口][ 相对路径]
ftps://[ 用户名[: 密码]@] 主机名或ip地址[: 端口][ 绝对路径]
sftp://[ 用户名[: 密码]@] 主机名或ip地址[: 端口][ 相对路径]
1
2
3

# 5. Classpath

res://classpath相对路径/image.png
1

# 引入 Commons-VFS

# 基础依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-vfs2</artifactId>
    <version>2.8.0</version>
</dependency>
1
2
3
4
5

# 可选依赖

<!--访问Sftp服务器文件时需要引入-->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

<!--访问Http服务器文件时需要引入-->
<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
12
13

# 参考资料

  • Apache Commons 官方网站 (opens new window)
  • Apache Commons VFS 官方文档 (opens new window)

今天介绍的内容就到这里了,感谢观看。

什么,还没看够?关注我看更多技术干货~

编辑 (opens new window)
#Apache Commons#VFS#虚拟文件系统#文件操作#HTTP#FTP#SFTP
上次更新: 2025/08/11, 09:56:17
Hutool——国产良心工具包,让你的java变得更甜
Java缓存技术哪家强?请找Apache Commons JCS

← Hutool——国产良心工具包,让你的java变得更甜 Java缓存技术哪家强?请找Apache Commons JCS→

最近更新
01
怎么写好技术文章?
08-25
02
CommonJS与ES模块:新手完全指南
08-21
03
Java Stream findFirst方法的空指针陷阱详解
08-14
更多文章>
Theme by Vdoing | Copyright © 2024-2025 吉森 | MIT License | 吉ICP备17006653号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式