If I have a directory contains a lot of files (about 1000 file). Some of these files named .processed and other not.
How can I list only 10 unprocessed files.
I am using this code to filter the processed file.
File[] inputFileList = inputDirectory.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return !pathname.getName().endsWith(".processed");
}
});
But if the number of un-processed files is huge, this may lead to memory error. so I need to read a limited number of files each time the application will run.
Which is why you should use java.nio.file. Using 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());
}
Using 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());
}
Unlike File.listFiles(), java.nio.file use lazily populated streams of directory entries.
One more reason to ditch File. This is 2015 after all.
In Java 8, you can directly use Files.walk() to create a Stream of 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());
In Java 7, you should not use DirectoryStream.Filter if you want that the files iteration stops as soon as the number of files to find is reached.
You could create a SimpleFileVisitor implementation to achieve it.
Whatever the number of files, to achieve such a requirement : extracting a specific number of files matching to a predicate from a directory, using SimpleFileVisitor appear straighter and more efficient than DirectoryStream.Filter.
So I think that it should be favored.
See my answer in this duplicate to see how to implement it.
来源:https://stackoverflow.com/questions/28694900/how-to-list-only-n-files-in-directory-using-java