如何将一些值传递给我的java.io.FileFilter实现?

时间:2015-04-01 19:55:26

标签: java java-7

我以这种方式实施了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。)

1 个答案:

答案 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;
}