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

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

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

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

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

使用java.nio API中的FilesPath而不是File

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

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

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

 List filteredFiles = new ArrayList<>(); SimpleFileVisitor visitor = new SimpleFileVisitor() { @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); 
 // 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] ); } 

关于合适的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; } } } 
Interesting Posts