@Service
public class LoadFileStringNum {private static final String FILE_PATH = "C:/Users/36995/Desktop/file.txt";private static final String SEARCH_STRING = "123";public static void main(String[] args) {int numThreads = Runtime.getRuntime().availableProcessors();ExecutorService executor = Executors.newFixedThreadPool(numThreads);List<Future<Long>> futures = new ArrayList<>();long total = 0;try (BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH))) {long totalLines = reader.lines().count();long linesPerThread = totalLines / numThreads;long startLine = 0;for (int i = 0; i < numThreads; i++) {long endLine = startLine + linesPerThread;if (i == numThreads - 1) {endLine = totalLines;}futures.add(executor.submit(new SearchTask(FILE_PATH, SEARCH_STRING, startLine, endLine)));startLine = endLine;}for (Future<Long> future : futures) {total += future.get();}System.out.println("总数: " + total);} catch (Exception e) {System.out.println(e.getMessage());} finally {executor.shutdown();}}
}
public class SearchTask implements Callable<Long> {private final String filePath;private final String searchWord;private final long startLine;private final long endLine;public SearchTask(String filePath, String searchWord, long startLine, long endLine) {this.filePath = filePath;this.searchWord = searchWord;this.startLine = startLine;this.endLine = endLine;}@Overridepublic Long call() throws Exception {long sum = 0;try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {for (long i = 0; i < startLine; i++) {reader.readLine();}String line;long lineNumber = startLine + 1;while ((line = reader.readLine()) != null && lineNumber <= endLine) {int index = line.indexOf(searchWord);while (index != -1) {sum++;index = line.indexOf(searchWord, index + 1);}lineNumber++;}}return sum;}
}