【问题标题】:How to get a specific number of files from a directory? [duplicate]如何从目录中获取特定数量的文件? [复制]
【发布时间】:2018-07-23 18:12:19
【问题描述】:

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

我怎样才能随机获取 50 个文件而不获取所有列表或遍历文件以获得 50 个?

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

编辑:我删除了for 语句。即使我只提供了一个要从中获取的文件夹,它也会获取所有文件,计数器变量仍然会遍历文件夹中的所有文件,这不是一个好的解决方案。

【问题讨论】:

  • 使用计数器变量仅循环遍历 50 个文件而不是所有文件..
  • 您别无选择。 File.listFiles 委托给 FileSystem 类,该类只有一个返回文件夹中所有文件的列表函数。

标签: java file java-7 filefilter


【解决方案1】:

使用 java.nio API 中的 FilesPath 而不是 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());

在 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);
    }
};

以及如何使用它:

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); 

【讨论】:

  • 漂亮的单线。有时最好的答案是最短的;-)
  • 哦,是你 :) 谢谢。事实上,这种情况经常发生。
  • 我认为 Java 7 标签的存在是有原因的。因此,如果 OP 使用 Java 7,他将无法使用 lambda。不错的答案。
  • 我正在使用 jdk 7。
  • @Kiki 我没看到。谢谢。我通过添加 Java 7 方式进行了更新。
【解决方案2】:
// Point to the directory
File directory = new File("C:/StroedFiles");
// Get a listing of all files in the directory
String[] filesInDir = directory.list();
// Grab as many files you want
for ( int i=0; i<50; i++ )
{
  System.out.println( "file: " + filesInDir[i] );
}

【讨论】:

    【解决方案3】:

    关于合适的FileFilter 实现的建议...

    public class LimitedFileFilter implements java.io.FileFilter {
        private int counter;
        private int limit;
    
        public LimitedFileFilter(int lim) {
            if (lim <= 0) {
                throw new IllegalArgumentException("Non-positive limit.");
            }
            limit = lim;
        }
    
        @Override
        public boolean accept(File name) {
            if (counter < limit &&
                name.isFile()   &&
                (name.getName().contains("key1")) {
                counter++;
                return true;
            }
            else {
                return false;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 2012-10-01
      • 2014-12-29
      • 2023-03-26
      • 1970-01-01
      • 2014-02-18
      • 2021-04-05
      • 2023-03-28
      • 2013-05-31
      相关资源
      最近更新 更多