![](/img/trans.png)
[英]Moving not empty directory recursively using Java NIO.2 FileVisitor and Files.walkFileTree(…)
[英]Java FileVisitor visit ordered in a directory
我正在尝试使用Java的FileVisitor接口浏览文件列表并将内容导入数据库。 该方案是按顺序导入csv内容。 可能存在一个名称为Object.csv,Object_updated.csv,Object_deleted.csv的文件,我需要将这些内容合并到一个数据库中。 文件夹层次结构将包含:
basepath
folderid
Objects
objectname
objectname.csv
objectname_updated.csv
objectname_deleted.csv
folderid_2 ....
这是我想出的基本解析结果:
private void testMethod() throws Exception
{
Storage.dumpPath = "C:\\Users\\TestUser\\Documents\\RestoreDummy";
Files.list(Paths.get(Storage.dumpPath)).sorted().forEach(path ->
{
logger.info("Main dir: " + path);
try
{
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
boolean objectDir = false;
@Override
public FileVisitResult preVisitDirectory(Path paramT, BasicFileAttributes paramBasicFileAttributes)
throws IOException
{
logger.info("Previsit dir: " + paramT);
if (paramT.getParent().endsWith(Constants.objectView)
&& paramT.getParent().getParent().equals(path))
objectDir = true;
else
objectDir = false;
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path mypath, BasicFileAttributes paramBasicFileAttributes)
throws IOException
{
if (objectDir && mypath.toString().endsWith("csv"))
{
logger.info("Visiting: " + mypath);
}
return FileVisitResult.CONTINUE;
}
});
}
catch (Exception e)
{
e.printStackTrace();
}
});
}
这返回的文件列表是:
Main dir: C:\Users\TestUser\Documents\RestoreDummy\1
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\1\Objects
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\1\Objects\ObjectName
Visiting: C:\Users\TestUser\Documents\RestoreDummy\1\Objects\ObjectName\ObjectName.csv
Main dir: C:\Users\TestUser\Documents\RestoreDummy\2
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\2
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\2\Describes
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\2\Objects
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\2\Objects\ObjectName
Visiting: C:\Users\TestUser\Documents\RestoreDummy\2\Objects\ObjectName\ObjectName_updated.csv
Main dir: C:\Users\TestUser\Documents\RestoreDummy\3
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\3
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\3\Describes
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\3\Objects
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\3\Objects\ObjectName
Visiting: C:\Users\TestUser\Documents\RestoreDummy\3\Objects\ObjectName\ObjectName_deleted.csv
Visiting: C:\Users\TestUser\Documents\RestoreDummy\3\Objects\ObjectName\ObjectName_updated.csv
Main dir: C:\Users\TestUser\Documents\RestoreDummy\4
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\4
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\4\Describes
Main dir: C:\Users\TestUser\Documents\RestoreDummy\5
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\5
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\5\Describes
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\5\Objects
Main dir: C:\Users\TestUser\Documents\RestoreDummy\6
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\6
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\6\Describes
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\6\Objects
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\6\Objects\ObjectName
Visiting: C:\Users\TestUser\Documents\RestoreDummy\6\Objects\ObjectName\ObjectName_updated.csv
Main dir: C:\Users\TestUser\Documents\RestoreDummy\7
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\7
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\7\Describes
Previsit dir: C:\Users\TestUser\Documents\RestoreDummy\7\Objects
如果有两个文件objectname_updated.csv和objectname_deleted.csv,则应先走objectname_updated.csv而不是objectname_deleted.csv。 该特定实例正在运行,但是文档说文件列表不保证顺序正确。 有没有一种方法可以根据文件名获得排序,还是必须存储预先排序的文件列表?
在preVisitDirectory()
您可以获取所有文件并对其进行排序和处理。
然后跳过访问子树。
像这样:
private static final List<Path> PATH_ORDER = Arrays.asList(Paths.get("objectname.csv"),
Paths.get("objectname_updated.csv"),
Paths.get("objectname_deleted.csv"));
@Override
public FileVisitResult preVisitDirectory(Path paramT, BasicFileAttributes paramBasicFileAttributes)
throws IOException
{
logger.info("Previsit dir: " + paramT);
if (paramT.getParent().endsWith(Constants.objectView)
&& paramT.getParent().getParent().equals(path))
{
try(Stream<Path> children = Files.list(paramT))
{
Path[] sortedPaths = children
.filter(path -> path.endsWith(".csv"))
.sorted((x, y) ->
PATH_ORDER.indexOf(x.getFileName())
-
PATH_ORDER.indexOf(y.getFileName()))
.toArray(Path[]::new);
// Process them
}
return FileVisitResult.SKIP_SUBTREE;
}
return FileVisitResult.CONTINUE;
}
注意:您也可以尝试使用番石榴订购进行排序
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.