如何使用 java 仅列出目录中的 N 个文件
How to list only N files in directory using java
如果我有一个目录包含很多文件(大约1000个文件)。其中一些文件名为 .processed 而其他文件则没有。
如何只列出 10 个未处理的文件。
我正在使用这段代码来过滤已处理的文件。
File[] inputFileList = inputDirectory.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return !pathname.getName().endsWith(".processed");
}
});
但是如果未处理的文件数量很大,这可能会导致内存错误。所以每次应用程序 运行.
时我都需要读取有限数量的文件
这就是您应该使用 java.nio.file 的原因。使用 Java 8:
final Path baseDir = Paths.get("path/to/dir");
final List<Path> tenFirstEntries;
final BiPredicate<Path, BasicFileAttributes> predicate = (path, attrs)
-> attrs.isRegularFile() && path.getFileName().endsWith(".processed");
try (
final Stream<Path> stream = Files.find(baseDir, 1, predicate);
) {
tenFirstEntries = stream.limit(10L).collect(Collectors.toList());
}
使用Java 7:
final Path baseDir = Paths.get("path/to/dir");
final List<Path> tenFirstEntries = new ArrayList<>(10);
final DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>()
{
@Override
public boolean accept(final Path entry)
{
return entry.getFileName().endsWith(".processed")
&& Files.isRegularFile(entry);
}
};
try (
final DirectoryStream<Path> stream
= Files.newDirectoryStream(baseDir, filter);
) {
final Iterator<Path> iterator = stream.iterator();
for (int i = 0; iterator.hasNext() && i < 10; i++)
tenFirstEntries.add(iterator.next());
}
与 File.listFiles()
不同,java.nio.file 使用延迟填充的目录条目流。
又一个放弃的理由 File
。毕竟是2015年了
在Java8中,可以直接使用Files.walk()
创建一个Stream
的Path
:
Path folder = Paths.get("...");
final int nbFilesToFound = 10;
List<Path> collect = Files.walk(folder)
.filter(p -> Files.isRegularFile(p) && !p.getFileName().toString().endsWith(".processed"))
.limit(nbFilesToFound)
.collect(Collectors.toList());
在 Java 7 中,如果您希望文件迭代在达到要查找的文件数时立即停止,则不应使用 DirectoryStream.Filter
。
您可以创建一个 SimpleFileVisitor
实现来实现它。
无论文件数量多少,要实现这样的需求:从目录中提取与谓词匹配的特定数量的文件,使用SimpleFileVisitor
比DirectoryStream.Filter
更直接和更高效。
所以我认为它应该受到青睐。
请参阅我在 中的回答以了解如何实施它。
如果我有一个目录包含很多文件(大约1000个文件)。其中一些文件名为 .processed 而其他文件则没有。
如何只列出 10 个未处理的文件。
我正在使用这段代码来过滤已处理的文件。
File[] inputFileList = inputDirectory.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return !pathname.getName().endsWith(".processed");
}
});
但是如果未处理的文件数量很大,这可能会导致内存错误。所以每次应用程序 运行.
时我都需要读取有限数量的文件这就是您应该使用 java.nio.file 的原因。使用 Java 8:
final Path baseDir = Paths.get("path/to/dir");
final List<Path> tenFirstEntries;
final BiPredicate<Path, BasicFileAttributes> predicate = (path, attrs)
-> attrs.isRegularFile() && path.getFileName().endsWith(".processed");
try (
final Stream<Path> stream = Files.find(baseDir, 1, predicate);
) {
tenFirstEntries = stream.limit(10L).collect(Collectors.toList());
}
使用Java 7:
final Path baseDir = Paths.get("path/to/dir");
final List<Path> tenFirstEntries = new ArrayList<>(10);
final DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>()
{
@Override
public boolean accept(final Path entry)
{
return entry.getFileName().endsWith(".processed")
&& Files.isRegularFile(entry);
}
};
try (
final DirectoryStream<Path> stream
= Files.newDirectoryStream(baseDir, filter);
) {
final Iterator<Path> iterator = stream.iterator();
for (int i = 0; iterator.hasNext() && i < 10; i++)
tenFirstEntries.add(iterator.next());
}
与 File.listFiles()
不同,java.nio.file 使用延迟填充的目录条目流。
又一个放弃的理由 File
。毕竟是2015年了
在Java8中,可以直接使用Files.walk()
创建一个Stream
的Path
:
Path folder = Paths.get("...");
final int nbFilesToFound = 10;
List<Path> collect = Files.walk(folder)
.filter(p -> Files.isRegularFile(p) && !p.getFileName().toString().endsWith(".processed"))
.limit(nbFilesToFound)
.collect(Collectors.toList());
在 Java 7 中,如果您希望文件迭代在达到要查找的文件数时立即停止,则不应使用 DirectoryStream.Filter
。
您可以创建一个 SimpleFileVisitor
实现来实现它。
无论文件数量多少,要实现这样的需求:从目录中提取与谓词匹配的特定数量的文件,使用SimpleFileVisitor
比DirectoryStream.Filter
更直接和更高效。
所以我认为它应该受到青睐。
请参阅我在