Java 列出目录(包括子目录)中所有文件的最有效方法是什么?

Java 列出目录(包括子目录)中所有文件的最有效方法是什么?,java,file,servlets,recursion,Java,File,Servlets,Recursion,我正在编写一个servlet,它将检查web容器外部服务器上的目录,并通过特定文件递归搜索特定文件,我指的是具有特定扩展名以及特定命名约定的文件。一旦找到这些文件,servlet就会给出一个长长的列表,列出所有找到的文件,包括文件的完整路径。我的问题是有太多的文件和目录,以至于我的servlet速度非常慢。我想知道对于这类问题是否有最佳实践或现有servlet?简单地编译整个文件列表并在客户端通过js/jquery进行过滤是否更有效?如果确实有大量文件,您可能会考虑生成一个外部进程来进行搜索。如

我正在编写一个servlet,它将检查web容器外部服务器上的目录,并通过特定文件递归搜索特定文件,我指的是具有特定扩展名以及特定命名约定的文件。一旦找到这些文件,servlet就会给出一个长长的列表,列出所有找到的文件,包括文件的完整路径。我的问题是有太多的文件和目录,以至于我的servlet速度非常慢。我想知道对于这类问题是否有最佳实践或现有servlet?简单地编译整个文件列表并在客户端通过js/jquery进行过滤是否更有效?

如果确实有大量文件,您可能会考虑生成一个外部进程来进行搜索。如果您在类似unix的服务器(如linux)上运行,则可以通过让find命令执行搜索并解析其输出来提高速度


您可以在谷歌上搜索许多如何使用“查找”的示例。

如果您确实有大量文件,您可能会考虑生成一个外部进程来进行搜索。如果您在类似unix的服务器(如linux)上运行,则可以通过让find命令执行搜索并解析其输出来提高速度


你可以在谷歌上搜索许多如何使用find的例子。

我认为你的servlet工作速度慢是因为硬盘速度太快。如果文件列表是永久性的,您应该将其加载到内存中

我认为由于硬盘速度的原因,servlet的工作速度很慢。如果文件列表是永久性的,您应该将其加载到内存中,那么磁盘访问速度很慢,并且随着文件和目录数量的增加,当使用传统的递归搜索目录树时,您的servlet将很快变得无用。如果有大量并发用户同时执行相同的搜索,您将特别快地达到此限制

相反,使用外部批处理作业生成文件列表要好得多,然后可以通过数据库调用,甚至通过解析包含由换行符分隔的所有文件名的文件,将这些文件读入servlet。在Linux上使用find是一种简单的方法:例如

find <path_to_directory> -name '*.bin' > list_files.txt

这将列出特定目录中以.bin结尾的每个文件名,并将其输出到名为list_files.txt的文件中。然后,您的servlet可以读入该文件并从中创建文件列表。

磁盘访问速度很慢,并且随着文件和目录数量的增加,当使用传统的递归搜索目录树时,您的servlet将很快变得无用。如果有大量并发用户同时执行相同的搜索,您将特别快地达到此限制

相反,使用外部批处理作业生成文件列表要好得多,然后可以通过数据库调用,甚至通过解析包含由换行符分隔的所有文件名的文件,将这些文件读入servlet。在Linux上使用find是一种简单的方法:例如

find <path_to_directory> -name '*.bin' > list_files.txt

这将列出特定目录中以.bin结尾的每个文件名,并将其输出到名为list_files.txt的文件中。然后,您的servlet可以读入该文件并从中创建文件列表。

我认为这一过程进展缓慢的可能原因有两个:

1磁盘I/O花费的时间太长。这将是一个真正的限制,你不能做太多。通常,操作系统非常擅长在内存中保留结构,以便更快地查找文件夹中的文件。如果速度太慢,您可能必须自己在内存中构建索引。这一切都取决于你怎么做

在任何情况下,如果这是您可以尝试测量的问题,那么进行过滤客户端将不会有任何帮助,因为无论您在哪里进行过滤,这都不会花费很长时间。相反,您将通过发送更多数据进行排序来降低客户端的速度

2您的目录遍历有问题。你说它是递归的。如果您的意思是它实际上是递归的,即每当遇到新目录时就调用自己的方法,那么这很可能会降低您的实际开销。wikipedia上有一些内容,但基本上只是使用队列或堆栈来跟踪遍历的位置,而不是使用方法状态来跟踪

请注意,文件系统实际上不是树,但我假设在本例中是树。否则它会变得有点毛茸茸的


我不同意其他海报上说的你不能在过程中实现它。在一定程度上,它应该工作得很好,目前还不需要批处理作业。

我认为这一过程进展缓慢的可能原因有两个:

1磁盘I/O速度太慢 ng。这将是一个真正的限制,你不能做太多。通常,操作系统非常擅长在内存中保留结构,以便更快地查找文件夹中的文件。如果速度太慢,您可能必须自己在内存中构建索引。这一切都取决于你怎么做

在任何情况下,如果这是您可以尝试测量的问题,那么进行过滤客户端将不会有任何帮助,因为无论您在哪里进行过滤,这都不会花费很长时间。相反,您将通过发送更多数据进行排序来降低客户端的速度

2您的目录遍历有问题。你说它是递归的。如果您的意思是它实际上是递归的,即每当遇到新目录时就调用自己的方法,那么这很可能会降低您的实际开销。wikipedia上有一些内容,但基本上只是使用队列或堆栈来跟踪遍历的位置,而不是使用方法状态来跟踪

请注意,文件系统实际上不是树,但我假设在本例中是树。否则它会变得有点毛茸茸的


我不同意其他海报上说的你不能在过程中实现它。在一定程度上,它应该工作得很好,目前还不需要批量作业。

非常感谢您的回答!谢谢你的回答!谢谢你的回复。我想我正在寻找一个批处理作业,因为这个servlet将被许多用户使用,而且文件列表非常大。如果我在服务器上执行一个简单的ls/find,则需要几分钟来列出所有内容。我明白了。查找可能比您自己实现的大多数事情都要快。不过,如果它很慢,而且你有多个用户一直在查询它,那么你仍然会扼杀你的性能,所以我会考虑使用一些内存结构或扁平索引。谢谢你的回应。我想我正在寻找一个批处理作业,因为这个servlet将被许多用户使用,而且文件列表非常大。如果我在服务器上执行一个简单的ls/find,则需要几分钟来列出所有内容。我明白了。查找可能比您自己实现的大多数事情都要快。不过,如果它很慢,而且你有多个用户一直在查询它,那么不管怎样,你仍然会扼杀你的性能,所以我会考虑使用一些内存结构或扁平索引。