我以这种方式实施了java.io.FileFilter
:
//get a list of files that:
// aren't directories
// have lastmodified times over X seconds in the past.
//And only get first Y files, even if there are more present.
private File[] getInputFiles(String inputDirectory) {
return new File(inputDirectory).listFiles(new FileFilter() {
int counter = 2; //TODO parameterize as Y
@Override
public boolean accept(File pathname) {
counter--;
return !pathname.isDirectory()
&& pathname.lastModified() <
System.currentTimeMillis() - 30 * 1000 //TODO parameterize as X
&& counter >= -1;
}
});
}
正如您所看到的,我的代码中有魔术数字。我想用参数替换它们。
我尝试new FileFilter(int X, int Y) {...}
,但那是编译时错误。
注意:Java 7.(我认为Java 8的一些功能在这里可以提供帮助,对吧?不幸的是,这应该是Java 7。)
答案 0 :(得分:2)
由于您使用的是Java 7+,请不要担心File
。使用java.nio.file。
你想要的是DirectoryStream.Filter<Path>
。它具有与FileFilter
几乎相同的签名,其优点是您将用于从目录(Files.newDirectoryStream()
)获取条目的方法实际上将返回延迟加载的目录条目迭代器其中File
将加载所有条目。
public final class MyFilter
implements DirectoryStream.Filter<Path>
{
// Now minus 30 seconds
private final FileTime timestamp
= FileTime.fromMillis(System.currentTimeMillis() - 30_000);
private int counter;
public MyFilter(final int initialCounter)
{
counter = initialCounter;
}
@Override
public boolean accept(final Path entry)
{
counter--;
if (!Files.isRegularFile(entry))
return false;
if (Files.getLastModifiedTime(entry).compareTo(timestamp) >= 0)
return false;
return counter > 0;
}
}
然后:
private List<Path> getInputFiles(final String baseDir, final int counter)
{
final Path path = Paths.get(baseDir);
final List<Path> result = new ArrayList<>();
final DirectoryStream.Filter<Path> filter
= new MyFilter(counter);
try (
final DirectoryStream<Path> stream = Files.newDirectoryStream(path, filter);
) {
for (final Path entry: stream)
result.add(entry);
}
return result;
}