Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java在Windows 10中构建文件索引_Java_Linux_Powershell - Fatal编程技术网

使用Java在Windows 10中构建文件索引

使用Java在Windows 10中构建文件索引,java,linux,powershell,Java,Linux,Powershell,我正在用Java编写一个桌面应用程序来快速查找文件。我在Java中使用了exec命令来运行powershell来实现这一点,因为Java的os.walk方法似乎要慢得多。现在,生成一个文本文件需要大约5分钟的时间,该文件列出了我计算机上所有文件的内容(总共约440000个文件) 这很好,但是我的问题是我没有办法更新这个文件列表。因此,如果我更改了文件系统中的一些文件,并希望更新我的文件列表,我不能快速地(即增量地)进行更新。相反,我必须从头开始生成文件列表 我知道您可以使用GitBash创建定位

我正在用Java编写一个桌面应用程序来快速查找文件。我在Java中使用了exec命令来运行powershell来实现这一点,因为Java的os.walk方法似乎要慢得多。现在,生成一个文本文件需要大约5分钟的时间,该文件列出了我计算机上所有文件的内容(总共约440000个文件)

这很好,但是我的问题是我没有办法更新这个文件列表。因此,如果我更改了文件系统中的一些文件,并希望更新我的文件列表,我不能快速地(即增量地)进行更新。相反,我必须从头开始生成文件列表


我知道您可以使用GitBash创建定位数据库(使用updatedb)。现在这是一个很棒的解决方案,但是我尝试创建的应用程序可能会被那些没有安装它的人使用。因此,我希望使用Windows提供的默认应用程序(即powershell,或Java原生应用程序)来实现这一点。我正在努力使这个应用程序易于使用,所以我不希望用户必须安装一堆其他依赖项

下面的代码展示了如何使用Java和完全避免Powershell。它在内存中构建一个数组并将其写入一个文本文件(列出了467000个文件),这一切只需不到30秒

在Main或任何您想要的地方运行以下代码。它调用createFileList方法

List<Path> pathsArrayList = new ArrayList<>();
Path rootPath_obj;
rootPath_obj = Paths.get(this.configMap.get("root_path"));
createFileList(rootPath_obj);

下面的代码显示了如何使用Java并完全避免Powershell。它在内存中构建一个数组并将其写入一个文本文件(列出了467000个文件),这一切只需不到30秒

在Main或任何您想要的地方运行以下代码。它调用createFileList方法

List<Path> pathsArrayList = new ArrayList<>();
Path rootPath_obj;
rootPath_obj = Paths.get(this.configMap.get("root_path"));
createFileList(rootPath_obj);

您可以发布您尝试过的代码吗?Files.walk…方法有点慢,因为它们检索文件属性。但是,如果您只想列出文件名,那么使用DirectoryStreams执行此操作的递归方法相当快,即使对于成千上万的文件也是如此。至于监视更改,您可能希望使用一个非常有用的VGR注册树中的每个目录。我会尝试一下,让你知道它工作得有多好。Lazycoder_007,然后我会发布我的代码以显示我的结果。因此,如果我使用DirectoryStreams将树中的文件递归地列出到某种数据库中,那么当WatchService密钥告诉我某些内容已更改时,我如何存储和更新此数据库?我不希望每次生成WatchKey时都必须重写整个数据库。您可以发布您尝试过的代码吗?Files.walk…方法有点慢,因为它们检索文件属性。但是,如果您只想列出文件名,那么使用DirectoryStreams执行此操作的递归方法相当快,即使对于成千上万的文件也是如此。至于监视更改,您可能希望使用一个非常有用的VGR注册树中的每个目录。我会尝试一下,让你知道它工作得有多好。Lazycoder_007,然后我会发布我的代码以显示我的结果。因此,如果我使用DirectoryStreams将树中的文件递归地列出到某种数据库中,那么当WatchService密钥告诉我某些内容已更改时,我如何存储和更新此数据库?我不想每次生成WatchKey时都重写整个数据库。
    System.out.println("Writing database...");
    try (FileWriter writer = new FileWriter(this.configMap.get("db_path"))) {
        for(Path pth: pathsArrayList){
            writer.write(pth.toString() + System.lineSeparator());
        }
    }
    System.out.println("...database written.");