【问题标题】:Create folders from folder id and parent id in java在java中从文件夹ID和父ID创建文件夹
【发布时间】:2011-09-23 16:30:22
【问题描述】:

我需要创建一个类来获取存储在数据库中的文件夹列表并在本地计算机上以正确的层次结构创建它们。

文件夹在数据库中的排列方式如下:

id 名称 parent_id 1 文件 0 2 部电影 0 3 视频 0 4 我的档案 1 5 桌面 0 6 其他 4

所以文档、电影、视频和桌面都在根目录中。 “我的文件”进入 id 为 1(文档)的文件夹,“其他”进入 id 为 4(我的文件)的文件夹

我一直在尝试使用为什么循环来做到这一点,但不知道如何让它们进入正确的文件夹。

try {
            con = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        while( i < 50 )
        {   
            try {            

            Statement st = con.createStatement();
            ResultSet result = st.executeQuery("SELECT name, id, parent_id FROM categories WHERE parent_id = '"+PID+"' AND repository_id = '"+RepoID+"'");



            while (result.next ())
            {
                String FolderName = result.getString ("name");
                String FolderId = result.getString ("id");
                String FolderId = result.getString ("parent_id");
make the folder name here
                System.out.println( FolderName+" "+FolderId );
            }

            System.out.println( " ");
                    i++ ;
            PID++;
            } catch (SQLException ex) {
                 System.out.println(ex.getMessage());
             }
            }

【问题讨论】:

    标签: java database jvm directory


    【解决方案1】:

    创建一个文件夹对象来存储数据,然后在从数据库中读取数据时构建这些对象。构建完所有文件夹对象后,执行最终循环以将每个文件夹绑定到其父类。也许是这样的:

    class Folder {
        private String name;
        private int id;
        private int parentId;
        private List<Folder> children = new ArrayList<Folder>();
    
        public Folder(String name, int id, int parentId) {
            this.name = name;
            this.id = id;
            this.parentId = parentId;
        }
    
        public void addChildFolder(Folder folder) {
            this.children.add(folder);
        }
    
        public List<Folder> getChildren() {
            return Collections.unmodifiableList(children);
        }
    
        public int getParentFolderId() {
            parentId;
        }
    
        public String getName() {
            return name;
        }
    
        public int getId() {
            return id;
        }
    }
    

    现在,当您从数据库中读取数据时,您将创建这些文件夹对象(没有子对象)并将它们添加到地图中:

    Map<Integer, Folder> data = new HashMap<Integer, Folder>();
    
    ... loop through your result set getting folder data...
    Folder newFolder = new Folder(nameString, id, parentId);
    data.put(newFolder.getId(), newFolder);
    

    使用 Integer.valueOf(String) 将 String 转换为 int。

    创建完所有文件夹后,您可以进行最后一个循环以将父文件夹连接到子文件夹,如下所示:

    for(Folder folder : data.values()) {
        int parentId = folder.getParentFolderId();
        Folder parentFolder = data.get(parentId);
        if(parentFolder != null)
            parentFolder.addChildFolder(folder);
    }
    

    最后,只需获取 id 为 0 的文件夹并开始在磁盘上构建文件,使用 folder.getChildren() 作为向下移动树的便捷方式。查看 File 对象的 javadoc,你会特别想使用 mkdirs() 方法。

    希望对您有所帮助。

    【讨论】:

    • 这一切对我来说都很好(以前从来没有关于对象的新事物)除了“data.put(newFolder.getId(), newFolder);”我得到:“类型不匹配:无法从元素类型整数转换为文件夹”并且 Eclipse 想要将“文件夹”转换为整数。知道我做错了什么吗?
    • 地图泛型类型错误,我已经编辑了创建地图的代码以反映这一点。应该是 Map data = new HashMap();
    • 我该如何处理最后一部分,抓住 id=0 的文件夹。我也不确定将代码放在哪里,目前它都在 pid 循环中
    • 您有一个从 id 到文件夹的 Map,因此 data.get(0) 将为您提供 id 为 0 的文件夹(如果有)。祝你好运。
    • 谢谢你,埃里克,不仅仅是为了弄清楚最后一部分,我走了。再次感谢
    【解决方案2】:

    一旦您从数据库中获取所有值,我建议创建一个Map&lt;Integer,Folder&gt;,它将每个文件夹 ID 映射到其文件夹信息(其中文件夹包含 ID、名称和父 ID)。然后,您可以遍历此地图,并为每个文件夹,通过递归父 ID 构建完整路径,直到您到达根目录和(例如“foo/bar/baz”),然后调用 File.mkdirs()这条路。

    【讨论】:

    • 感谢您修改我的问题,我对 Java 和堆栈溢出非常陌生,但我很高兴学习,我已经构建了一些基本的 java 应用程序和一些 android 应用程序,但这有点高级为了我。我不太了解映射和递归循环是如何工作的,你能给我举个例子吗?谢谢
    • @user961574 - 在本网站上获得帮助的最佳方式是发布有针对性的问题。 “我如何编写这段代码”不是很有针对性。相反,我建议对其进行破解并发布您创建的内容并询问有关哪些内容不起作用的问题。 (您可以编辑您的问题以添加新代码)
    • 谢谢,我以前没有用这个网站提问,只是在谷歌搜索时找到它,通常在指向这个网站的结果上找到我需要的修复。如果我没有运气,我将编写代码的新版本并再次发布。再次感谢
    【解决方案3】:

    我看到您在 9 月 29 日的评论询问有关打印文件夹的问题。您的代码似乎没问题,只是您只打印出父文件夹的名称。如果你想打印它们,你需要深入挖掘孩子并打印它们,也许是这样的:

    ...
    for (Folder folder : data.values()) {
        int parentId = folder.getParentFolderId();
        Folder parentFolder = data.get(parentId);
        if (parentFolder != null)
            parentFolder.addChildFolder(folder);
    }
    
    printFolderRecursively(data.get(1));
    

    然后编写一个打印文件夹名称及其子文件夹名称的方法:

    public void printFolderRecursively(Folder folder) {
        System.out.print("/" + rootFolderName);
        for(Folder child : folder.getChildren())
            printFolderRecursively(child);
    }
    

    希望有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多