如何从目录中获取特定数量的文件?

usm*_*man 1 java file filefilter java-7

我想根据我在properties文件中提供的设置检索文件.例如,我只想在第一次迭代中获得50个文件并停止获取所有文件夹中可能存在数千个文件.

我怎么能随机获得50个文件并且没有获得所有列表或迭代文件以获得50?

filesList = folder.listFiles( new FileFilter() {                
    @Override
    public boolean accept(File name) {                      
        return (name.isFile() && ( name.getName().contains("key1")));
    }
});
Run Code Online (Sandbox Code Playgroud)

编辑:我删除了for声明.即使我只提供了一个文件夹来获取它将获取所有文件,计数器变量仍然循环文件夹中的所有文件不是一个好的解决方案.

dav*_*xxx 6

使用FilesPath来自java.nio API而不是File.

您也可以在Java 8中使用Stream:

Path folder = Paths.get("...");
List<Path> collect = Files.walk(folder)
                          .filter(p -> Files.isRegularFile(p) && p.getFileName().toString().contains("key1"))
                          .limit(50)
                          .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

在Java 7中,您可以使用一个SimpleFileVisitor实现来停止文件遍历,该实现需要注意终止,因为50个文件与谓词匹配:

List<Path> filteredFiles = new ArrayList<>();

SimpleFileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        if (Files.isRegularFile(file) && file.getFileName()
                                             .toString()
                                             .contains("key1")) {
            filteredFiles.add(file);
        }

        if (filteredFiles.size() == 50) {
            return FileVisitResult.TERMINATE;
        }
        return super.visitFile(file, attrs);
    }
};
Run Code Online (Sandbox Code Playgroud)

以及如何使用它:

final Path folder = Paths.get("...");

// no limitation in the walking depth 
Files.walkFileTree(folder, visitor);

// limit the walking depth to 1 level
Files.walkFileTree(folder, new HashSet<>(), 1, visitor); 
Run Code Online (Sandbox Code Playgroud)