基于JSON数据的Java文件移动

标签 java json swing

我有一个将目录结构输出为 JSON 的程序。我使用 JSON 数据在 Java Swing 程序中显示目录结构的树形表示。

示例 JSON 数据:

{
    "path": "src/modules/abc/module",
    "name": "module",
    "type": "folder",
    "children": [
        {
            "path": "src/modules/abc/module/controllers",
            "name": "controllers",
            "type": "folder",
            "children": [
                {
                    "path": "src/modules/abc/module/controllers/abc-module-controller.js",
                    "name": "abc-module-controller.js",
                    "type": "file"
                }
            ]
        },
        {
            "path": "src/modules/abc/module/layouts",
            "name": "layouts",
            "type": "folder",
            "children": [
                {
                    "path": "src/modules/abc/module/layouts/abc-layout.js",
                    "name": "abc-layout.js",
                    "type": "file"
                }
            ]
        },
        {
            "path": "src/modules/abc/module/routes",
            "name": "routes",
            "type": "folder",
            "children": [
                {
                    "path": "src/modules/abc/module/routes/abc-module-router.js",
                    "name": "abc-module-router.js",
                    "type": "file"
                }
            ]
        },
        {
            "path": "src/modules/abc/module/templates",
            "name": "templates",
            "type": "folder",
            "children": [
                {
                    "path": "src/modules/abc/module/templates/layout.hbs",
                    "name": "layout.hbs",
                    "type": "file"
                },
                {
                    "path": "src/modules/abc/module/templates/links.hbs",
                    "name": "links.hbs",
                    "type": "file"
                }
            ]
        },
        {
            "path": "src/modules/abc/module/views",
            "name": "views",
            "type": "folder",
            "children": [
                {
                    "path": "src/modules/abc/module/views/links-view.js",
                    "name": "links-view.js",
                    "type": "file"
                }
            ]
        }
    ]
}

基于 Java Swing 的树是可拖放的,这意味着用户可以用来重新排列文件夹和文件结构。(仅允许重新排列,不允许添加、删除或复制文件/文件夹)

现在,重新排列完成后,用户可以将数据保存为 JSON。

我想使用修改后的 JSON 并重新排列实际的物理文件和文件夹。

例如:如果文件“useful.file”最初存在于文件夹“Paris”下,并且使用 Swing 的客户将其拖放到另一个文件夹“London”中,那么我必须复制该文件(“useful.file” ") 从巴黎文件夹到伦敦文件夹。

我遵循了oracle java站点中给出的复制程序

https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/essential/io/examples/Copy.java

并且能够从源复制到目标,但我想使用 JSON 内容作为输入来进行重新排列。

我想知道,正确的做法是什么

1)读取原始JSON和修改后的JSON,找到增量然后移动文件?

2) 使用修改后的 JSON 作为输入,无需担心原始 JSON 详细信息

我可以在这样的程序的帮助下遍历 JSON How do you tree walk JSON via Jackson 2 JsonNode?

但是步行并使用输入通过复制程序重新排列物理文件变得越来越复杂。

任何帮助将不胜感激。

最佳答案

因此,根据您的输入,我看到了三个线索:

1 - 如果文件名唯一

每个文件都是唯一的,因此您可以轻松检查文件在新结构中移动的位置。

遍历 JSON 树,并填充 HashMap<String,File> ,树的每片叶子:

map.put(filename, new File(filepath));

对输入和输出数据执行此操作。然后你就有了两张 map 。然后您可以应用这些 Action :

for(Entry<String,File> entry : inputMap.entrySet()){
   File f = outputMap.get(entry.getKey());
   if(! f.equals(entry.getValue())){
      moveFile(entry.getValue(), f);
   }
}

2 - 如果文件名不唯一:添加标识符

如果名称不唯一,则您无法使用其名称明确识别文件。解决方案是添加一个标识符。这可以只是您在构建 JSON 表时递增的一个简单数字。然后您的文件条目将如下所示:

{
     "path": "src/modules/abc/module/layouts/abc-layout.js",
     "name": "abc-layout.js",
     "type": "file"
     "id": "42"
}

您的 Swing GUI 必须跟踪这些 id,并相应地返回 JSON 数据。

然后您可以应用解决方案 1,除非替换 HashMap<String,File>通过HashMap<Integer,File> .

3-跟踪文件移动

正如 @vanOekel 所建议的,如果这对您来说是可能的,请让您的 Swing GUI 跟踪移动并返回这些移动。

“移动”可以很简单:

public class Move {
   public File source, dest;
}

并相应地以 JSON 表示:

{
    "source" : "/somewhere/on/the/disk/file.ext"
    "dest" : "/elsewhere/on/the/disk/file.ext" 
}

然后您可以通过遍历此 JSON 数据在服务器上重建走法列表,并轻松应用走法:

for(Move move : listOfMoves)
   moveFile(move.source, move.dest);

关于基于JSON数据的Java文件移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31462315/

相关文章:

Java:用于创建动画帮助叠加动画的 Swing 库?

java - 使用 Hibernate Session 的最简单方法

java - 验证服务器之间的用户请求

c# - 我应该使用 Try Catch block 来实现我的业务逻辑吗?

java - 如何设置 oracle.net.ns.SQLnetDef.TCP_CONNTIMEOUT_STR

Javascript jQuery post()/get() JSON 对象作为文档准备好之前的闭包函数

java - 有没有什么方法可以将滚动 Pane 添加到 jlist 中,并将其添加到具有空布局的面板上?

php - 在 PHP 7.0 中 fatal error : Uncaught Error: Call to undefined function json_encode()

ruby - 我在哪里可以看到我的浏览器发送的 http 请求

java - JDialog 关闭时内存泄漏