这就是为什么你应该使用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年。
来源
2015-02-24 11:48:21
fge
注意endsWith()for Path的工作方式与String不同 – 2016-07-25 11:28:25