Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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—打开大量文件并搜索单词的最佳方法?_Java_Search_Bufferedreader - Fatal编程技术网

Java—打开大量文件并搜索单词的最佳方法?

Java—打开大量文件并搜索单词的最佳方法?,java,search,bufferedreader,Java,Search,Bufferedreader,我正在搜索一个包含大约450个文件的目录,每个文件大约20kb。以下是我的方法: public void search(String searchWord) throws IOException { this.directoryPath = FileSystems.getDefault().getPath(this.directoryString); this.fileListStream = Files.newDirectoryStream(this.directoryPath

我正在搜索一个包含大约450个文件的目录,每个文件大约20kb。以下是我的方法:

public void search(String searchWord) throws IOException
{
    this.directoryPath = FileSystems.getDefault().getPath(this.directoryString);
    this.fileListStream = Files.newDirectoryStream(this.directoryPath);
    int fileCount = 0;
    for(Path path : this.fileListStream)
    {
        String fileName = path.getFileName().toString();
        if(!fileName.startsWith("."))
        {
            BufferedReader br = Files.newBufferedReader(path, Charset.defaultCharset());
            String line;
            while((line = br.readLine()) != null)
            {
                System.out.println(fileName + ": " + line);
            }
            fileCount++;
            br.close();
        }
    }

    System.out.println("File Count: " + fileCount);
}
我的目标是逐字逐句地查找searchWord的匹配项,并打印出行号和找到它的文件名


我的问题是,我想知道是否应该将行拆分为一个数组,并在数组中搜索单词,然后将其添加到列表中。或者我应该将整个文件扫描成一个单词数组,然后搜索单词并将其添加到列表中?或者这有什么关系?另外,如果有更好的方法,请让我知道!由于资源有限,我正在尽可能高效地执行此操作。

您可以使用Scanner类解析文件,并使用其next()方法读取每个单词,这样就不需要任何数组或其他存储。如果可能的话,尝试对每个文件使用多线程,这甚至可以提高性能。

您不应该逐字查找,只需将整行作为字符串读取,然后使用String.indexOf()方法查找该行是否包含该单词。

除非需要,否则不应该将任何内容保存到数组中。只要在阅读
文件时检查单词是否与
searchWord
相等,您就可以获胜,但不是使用简单的搜索,而是类似于Aho-Corasick算法,这会将搜索字符串预编译成一个结构,然后可以用来高效地搜索所有文件。为什么不试试apache solr?如果文件是按字母顺序组织的,那么可以使用更高效的搜索算法。如果必须对同一文件上的不同词执行大量搜索,则可以编制索引(一致性)是一种可行的方法。因此,没有单一的最佳方法,有许多方法适合某些场景,但不适合其他场景。一般来说,多线程不会加快IO绑定进程,事实上可能会使它们变慢。这取决于系统。例如,“I/O绑定”只是指“一个线程大部分时间都在等待I/O完成,而不是使用CPU”,但这并不意味着“我们已经达到了系统I/O带宽限制”,那么IMO拥有多个线程(或异步I/O)可能会提高性能(通过启用多个并发I/O操作)。这就是为什么我说这只是一条一般规则。它并不总是有效的,但当您试图同时读取不同位置(但在同一磁盘上)的文件时,通常磁盘I/O会恶化。谢谢。我不知道为什么我没有想到这一点。这非常有效,而且对于我正在处理的项目来说也不会太费劲。