gpt4 book ai didi

java - 获取目录中文件的内容

转载 作者:行者123 更新时间:2023-12-01 22:47:53 24 4
gpt4 key购买 nike

我想获取目录中文件的内容:

/sys/block/sda/device/model

我使用此代码来获取内容:

String content = new String(Files.readAllBytes(Paths.get("/sys/block/sda/device/model")));

但在某些情况下,我有这样的情况:

/sys/block/sda/device/model
/sys/block/sdb/device/model
/sys/block/sdc/device/model

如何迭代以

开头的所有目录

sd* 并打印文件model

您能给我展示一些带有过滤器的 Java 8 示例吗?

最佳答案

以下是如何使用 Java 8 功能执行此操作的示例:

Function<Path,byte[]> uncheckedRead = p -> {
try { return Files.readAllBytes(p); }
catch(IOException ex) { throw new UncheckedIOException(ex); }
};
try(Stream<Path> s=Files.find(Paths.get("/sys/block"), 1,
(p,a)->p.getName(p.getNameCount()-1).toString().startsWith("sd"))) {
s.map(p->p.resolve("device/model")).map(uncheckedRead).map(String::new)
.forEach(System.out::println);
}

这是一个力求紧凑且独立工作的示例。对于实际的应用程序,您可能会采取一些不同的做法。使用 IO 操作作为不允许检查异常的函数的任务非常常见,因此您可能有一个包装函数,例如:

interface IOFunction<T,R> {
R apply(T in) throws IOException;
}
static <T,R> Function<T,R> wrap(IOFunction<T,R> f) {
return t-> { try { return f.apply(t); }
catch(IOException ex) { throw new UncheckedIOException(ex); }
};
}

然后就可以使用

try(Stream<Path> s=Files.find(Paths.get("/sys/block"), 1,
(p,a)->p.getName(p.getNameCount()-1).toString().startsWith("sd"))) {
s.map(p->p.resolve("device/model")).map(wrap(Files::readAllBytes))
.map(String::new).forEach(System.out::println);
}

但是,即使返回的 DirectoryStream 不是 Stream,因此需要手动 Stream,您也可能会使用 newDirectoryStream 创建,因为此方法允许传递像 "sd*":

这样的 glob 模式
try(DirectoryStream<Path> ds
=Files.newDirectoryStream(Paths.get("/sys/block"), "sd*")) {
StreamSupport.stream(ds.spliterator(), false)
.map(p->p.resolve("device/model")).map(wrap(Files::readAllBytes))
.map(String::new).forEach(System.out::println);
}

最后,应该提到将文件作为行流处理的选项:

try(DirectoryStream<Path> ds
=Files.newDirectoryStream(Paths.get("/sys/block"), "sd*")) {
StreamSupport.stream(ds.spliterator(), false)
.map(p->p.resolve("device/model")).flatMap(wrap(Files::lines))
.forEach(System.out::println);
}

关于java - 获取目录中文件的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25076214/

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