繁体   English   中英

Java FileVisitor访问在目录中排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM