如何从目录中获取特定数量的文件? [复制]
Posted
技术标签:
【中文标题】如何从目录中获取特定数量的文件? [复制]【英文标题】: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
类,该类只有一个返回文件夹中所有文件的列表函数。
【参考方案1】:
使用 java.nio API 中的 Files
和 Path
而不是 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;
【讨论】:
以上是关于如何从目录中获取特定数量的文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
你能告诉我如何从声音中检测事件,无论其波或频谱的一部分是不是超过特定数量的阈值? [复制]
如何从 iPhone 中后台进程的名称访问(复制/修改)特定的 appfile 目录?