gpt4 book ai didi

java - 使用多线程读取多个txt文件搜索字符串

转载 作者:行者123 更新时间:2023-11-30 06:56:36 31 4
gpt4 key购买 nike

我有一个包含 100 个 .txt 文件的文件夹,每个文件大小为 20 或 + MB。所有文件都有大约 2*10^5 行 UTF-8 编码文本

可能使用多线程,查找哪些文件包含固定键字符串的最快方法是什么? (包含的标准与 java .contains() 函数相同,即普通子字符串)。

我在这里找到了几种方法,但没有使用多线程(为什么?),并且所有这些方法似乎都根据要求而改变速度,我似乎无法理解哪种方法更适合我。

例如这种 super 复杂的方法:

https://codereview.stackexchange.com/questions/44021/fast-way-of-searching-for-a-string-in-a-text-file

似乎比使用 BufferedReader 和 .contains() 函数进行简单的逐行搜索慢 2 倍。怎么可能?

如何充分利用多线程的潜力?该程序在功能非常强大的多核机器上运行。

我正在寻找的输出是哪些文件包含该字符串,以及可能在哪一行。

最佳答案

下面的代码可以完成这项工作。

它将进入您的目录并查找所有文件。然后将为每个文件创建一个新线程并查找目标字符串。

确保根据需要更改 TheThread 类中的文件夹路径和目标字符串

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;


//class used for thread
class TheThread implements Runnable {

int counter = 0;

//to get stream of paths
Stream<Path> streamOfFiles = Files.walk(Paths.get("./src/Multi_tasking/Files"));

//List of total all files in the folder
List<Path> listOfFiles = streamOfFiles.collect(Collectors.toList());

//because Files.walk may throw IOException
public TheThread() throws IOException {
}


@Override
public void run() {

//increments counter to access the indexes of the list
counter++;

//Calling the method for search file at index counter and target String
SearchTextInMultipleFilesUsingMultiThreading.lookIn(listOfFiles.get(counter), "target String");
}
}

public class SearchTextInMultipleFilesUsingMultiThreading {

//method responsible for searching the target String in file
public static void lookIn(Path path, String text) {
try {
List<String> texts = Files.readAllLines(path);
boolean flag = false;
for (int i = 0; i < texts.size(); i++) {
String str = texts.get(i);
if (str.contains(text)) {
System.out.println("Found \"" + text + "\" in " + path.getFileName() + " at line : " + (i + 1) + " from thread : " + Thread.currentThread().getName());
flag = true;
}
}
if (!flag) {
System.out.println("\"" + text + "\" not found in " + path.getFileName() + " through thread : " + Thread.currentThread().getName());
}

} catch (IOException e) {
System.out.println("Error while reading " + path.getFileName());
e.printStackTrace();
}
}

public static void main(String[] args) throws IOException {

//creating object of our thread class
TheThread theThread = new TheThread();

//getting the number of files in the folder
int numberOfFiles = theThread.listOfFiles.size() - 1;

//if the folder doesn't contain any file at all
if (numberOfFiles == 0) {
System.out.println("No file found in the folder");
System.exit(0);
}

//creating the List to store threads
List<Thread> listOfThreads = new ArrayList<>();

//keeping required number of threads inside the list
for (int i = 0; i < numberOfFiles; i++) {
listOfThreads.add(new Thread(theThread));
}

//starting all the threads
for (Thread thread :
listOfThreads) {
thread.start();

}
}

}

关于java - 使用多线程读取多个txt文件搜索字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41666331/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com