gpt4 book ai didi

java - 读取我的网络驱动器上的所有文件和文件夹

转载 作者:行者123 更新时间:2023-12-02 01:31:45 24 4
gpt4 key购买 nike

假设您的任务是读取某个文件夹中保存的所有文件并处理每个文件。为了简单起见,我们假设所有文件都是 HTML 文件,并且您想要从中提取 HTML 内容。

在 Java 8 中,Files.walk API 允许我们做类似的事情。这是一个例子:

try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) {
paths
.filter(Files::isRegularFile)
.forEach(System.out::println);
}

如果您必须处理少量文件夹和文件,这听起来确实不错,但如果您有数百万个文件分布在多个网络驱动器上,那么这个过程将需要很长时间,并且显然需要并行化。在这种情况下有什么想法可以并行吗?

最佳答案

我认为没有一个简单的通用算法可以解决您的问题。

事实上,处理分布在许多节点上的大量数据时,一般的想法是让每个节点收集数据并处理这些部分结果单节点。

从单个系统进行所有扫描将会很困难。

要进行一些真正的优化,您不能以相同的方式对待所有文件夹。

您可以做的是创建一个可以并行扫描的路径集合

因此,您可以沿着多个文件夹(可能每个网络驱动器一次)开始多次行走,而不是沿着单个根行走

为此,您需要知道哪条路径是网络路径,哪条路径是本地路径。

例如,如果您有一个文件夹,其中每个子文件夹都是已安装的网络驱动器,则您可以轻松收集所有这些文件夹,并为每个文件夹并行运行行走

我会执行类似于以下代码的操作:

public class ParallelWalks {
ExecutorService executor = Executors.newCachedThreadPool();
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

public static void main(String[] args) {
new ParallelWalks().exec();
}


public ExecutorService executorSelector(Path path) {
if(isNetworkDrive(path)) {
return executor;
}else {
return singleThreadExecutor;
}
}


private boolean isNetworkDrive(Path path) {
// Here goes the logic to choose which path should go on a different
// thread.
return path.toString().contains("srv");
}


private void exec() {
Path path = Paths.get("/home/you/Desktop");
try (Stream<Path> files = Files.list(path)) {
files.forEach(this::taskRunner);
} catch (IOException e) {
// Do something with the exception
}
}

private void taskRunner(final Path path) {
executorSelector(path)
.submit(() -> doWalk(path));
}

private void doWalk(Path path) {
try (Stream<Path> paths = Files.walk(path)) {
paths.filter(Files::isRegularFile).forEach(System.out::println);
} catch (IOException e) {
// Do something with the exception
}
}

}

这样,您的所有本地目录将按顺序处理,所有网络驱动器将在其线程上分别处理。

仅当所有(或大部分)网络驱动器共享相同的父挂载点时,它才有效。

否则您应该实现自己的walk

关于java - 读取我的网络驱动器上的所有文件和文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57552683/

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