You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:36:20