我有一个将目录结构输出为 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站点中给出的复制程序
并且能够从源复制到目标,但我想使用 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/