如何遍历Apache Commons VFS虚拟文件系统并生成嵌套JSON结构
Apache Commons VFS 遍历Jar虚拟文件系统生成嵌套目录树实现
核心思路
利用VFS自带的文件层级访问能力,通过深度优先递归遍历虚拟文件系统的所有节点,按层级映射到DirNode结构,最终直接通过JSON序列化工具输出嵌套JSON即可。
实现代码
1. 递归遍历逻辑
import org.apache.commons.vfs2.FileObject; import org.apache.commons.vfs2.FileType; import java.util.ArrayList; import java.util.List; public class JarFSTreeBuilder { /** * 解析Jar虚拟文件系统,生成根目录节点 * @param vfsRoot createVirtualFileSystem返回的虚拟文件系统根对象 * @return 完整嵌套的目录树结构 */ public DirNode buildTree(FileObject vfsRoot) throws Exception { DirNode root = new DirNode(); // 根节点路径固定为/,id用根路径生成唯一值 root.setId(vfsRoot.getName().getURI()); root.setPath("/"); root.setChildren(traverseChildren(vfsRoot)); return root; } /** * 递归遍历子节点 */ private List<DirNode> traverseChildren(FileObject parent) throws Exception { List<DirNode> childNodes = new ArrayList<>(); FileObject[] childFiles = parent.getChildren(); if (childFiles == null || childFiles.length == 0) { return childNodes; } for (FileObject childFile : childFiles) { DirNode currentNode = new DirNode(); String nodePath = childFile.getName().getPath(); currentNode.setId(nodePath); currentNode.setPath(nodePath); // 目录节点递归处理子级,文件节点返回空子节点列表 if (childFile.getType() == FileType.FOLDER) { currentNode.setChildren(traverseChildren(childFile)); } else { currentNode.setChildren(new ArrayList<>()); } childNodes.add(currentNode); } return childNodes; } }
2. 调用方式
直接对接已有的VFS初始化逻辑即可:
// 原有初始化逻辑 fsManager = VFS.getManager(); FileObject jarFile = fsManager.resolveFile("jar:" + jarPath); FileObject jarVfs = fsManager.createVirtualFileSystem(jarFile); // 生成目录树 JarFSTreeBuilder treeBuilder = new JarFSTreeBuilder(); DirNode rootNode = treeBuilder.buildTree(jarVfs); // 直接用Jackson/Gson等JSON框架序列化rootNode,即可得到目标嵌套JSON
注意事项
- 如果不需要将Jar包本身作为根节点,可以直接取
traverseChildren(jarVfs)的返回结果作为顶层结构,按需调整即可 - 若需要过滤META-INF、签名文件等不需要的内容,在遍历循环中加路径判断逻辑跳过对应节点即可
- 操作完成后记得调用
jarVfs.close()、jarFile.close()释放文件句柄,避免资源泄漏 - 给
DirNode类补充对应getter/setter方法,或者使用Lombok@Data注解,即可直接被JSON序列化框架识别
内容的提问来源于stack exchange,提问作者user9890324
相关产品推荐
相关产品推荐

