gpt4 book ai didi

java - 使用ExecutorService和Java中的Callable编写文件不起作用

转载 作者:行者123 更新时间:2023-12-03 12:59:25 24 4
gpt4 key购买 nike

我正在编写一个例程,该例程将从文件中检索URL列表,使用JSoup获取每个URL的内容,找到某些模式,然后将结果写入输出文件(每个分析的URL一个)。

我有一个WebPageAnalysisTask(实现Callable),现在返回null,但是它将返回一个对象,其中包含处理结果(待完成):

public WebPageAnalyzerTask(String targetUrl, Pattern searchPattern) {
this.targetUrl = targetUrl;
this.searchPattern = searchPattern;
}

@Override
public WebPageAnalysisTaskResult call() throws Exception {
long startTime = System.nanoTime();
String htmlContent = this.getHtmlContentFromUrl();
List<String> resultContent = this.getAnalysisResults(htmlContent);

try (BufferedWriter bw = Files.newBufferedWriter(Paths.get("c:/output", UUID.randomUUID().toString() + ".txt"),
StandardCharsets.UTF_8, StandardOpenOption.WRITE)) {
bw.write(parseListToLine(resultContent));
}

long endTime = System.nanoTime();
return null;
}

我正在使用NIO和try-with-resources编写文件。

将使用该任务的代码如下:
/**
* Starts the analysis of the Web Pages retrieved from the input text file using the provided pattern.
*/
public void startAnalysis() {
List<String> urlsToBeProcessed = null;

try (Stream<String> stream = Files.lines(Paths.get(this.inputPath))) {

urlsToBeProcessed = stream.collect(Collectors.toList());

if (urlsToBeProcessed != null && urlsToBeProcessed.size() > 0) {
List<Callable<WebPageAnalysisTaskResult>> pageAnalysisTasks = this
.buildPageAnalysisTasksList(urlsToBeProcessed);
ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
List<Future<WebPageAnalysisTaskResult>> results = executor.invokeAll(pageAnalysisTasks);
executor.shutdown();
} else {
throw new NoContentToProcessException();
}

} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Builds a list of tasks in which each task will be filled with data required for the analysis processing.
* @param urlsToBeProcessed The list of URLs to be processed.
* @return A list of tasks that must be handled by an executor service for asynchronous processing.
*/
private List<Callable<WebPageAnalysisTaskResult>> buildPageAnalysisTasksList(List<String> urlsToBeProcessed) {
List<Callable<WebPageAnalysisTaskResult>> tasks = new ArrayList<>();
UrlValidator urlValidator = new UrlValidator(ALLOWED_URL_SCHEMES);

urlsToBeProcessed.forEach(urlAddress -> {
if (urlValidator.isValid(urlAddress)) {
tasks.add(new WebPageAnalyzerTask(urlAddress, this.targetPattern));
}
});

return tasks;
}

包含URL列表的文件被读取一次。 ExecutorService为每个URL创建任务,并将异步分析和写入带有结果的文件。

到目前为止,正在读取文件,并且正在分析每个URL的HTML内容并将其保存在String中。但是,该任务未写入文件。所以我想知道那里会发生什么。

有人可以告诉我是否想念东西吗?

提前致谢。

最佳答案

以下try块中可能出现异常

try (BufferedWriter bw = Files.newBufferedWriter(Paths.get("c:/output", UUID.randomUUID().toString() + ".txt"),
StandardCharsets.UTF_8, StandardOpenOption.WRITE)) {
bw.write(parseListToLine(resultContent));
}

尝试向其添加 catch块,并在实际发生异常的情况下打印异常,以查看导致该异常的原因
catch (IOException e) {
// Replace with logger or some kind of error handling in production code
e.printStackTrace();
}

关于java - 使用ExecutorService和Java中的Callable编写文件不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45657491/

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