查找具有特定名称的最后修改过的文件?

时间:2015-01-14 22:58:12

标签: java sorting file-io

我正在尝试找到文件的最后修改版本,我有这个工作但是当我尝试找到某个文件时,我得到了NULLPointerException。我的代码:

public static File getFile(String dir, String chat) {

    File fl = new File(dir);
    File[] files = fl.listFiles(new FileFilter() {          
        public boolean accept(File file) {
            return file.isFile();
        }
    });
    long lastMod = Long.MIN_VALUE;
    File choice = null;
    for (File file : files) {
        if (file.lastModified() > lastMod && file.getName().contains(chat)) {
            choice = file;
            lastMod = file.lastModified();
        }
    }
    return choice;
}

当您使用“&& file.getName()。contains(chat)”out 时,代码可以正常工作。否则,它会给我NullPointerException错误。

我知道这样的事情有效,因为我有它工作但需要从头开始使用我的代码:(

2 个答案:

答案 0 :(得分:0)

这是NullPointerException的来源。

File choice = null;

在此处调用之前,您需要实例化它 - > choice = file;

File choice = new File(dir);

答案 1 :(得分:0)

这是使用java.nio.file的版本:

public static Path getMostRecent(final String dir, final String chat)
    throws IOException
{
    final Path dirpath = Paths.get(dir).toAbsolutePath();
    Path ret = null;
    FileTime mostRecent = FileTime.fromMillis(0L); // Jan 1st 1970, 00:00:00 GMT
    FileTime current;

    final DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<>()
    {
        @Override
        public boolean accept(final Path entry)
        {
            return Files.isRegularFile(entry)
                && entry.getFileName().toString().contains(chat);
        }
    };

    for (final Path entry: Files.newDirectoryStream(dirpath, filter)) {
        current = Files.getLastModifiedTime(entry);
        if (current.compareTo(mostRecent) > 0) {
            mostRecent = current;
            ret = entry;
        }
    }

    return entry;
}

如果您使用Java 8:

public static Path getMostRecent(final String dir, final String chat)
    throws IOException
{
    final Path dirpath = Paths.get(dir).toAbsolutePath();
    try (
        final Stream<Path> entries = Files.list(dirpath);
    ) {
        return entries.filter(Files::isRegularFile)
            .filter(entry -> entry.getFileName().toString().contains(chat))
            .sorted(Comparator.comparing(Files::getLastModifiedTime).reversed())
            .findFirst().orElse(null);
    }
}