1

我需要一个 java 程序,它可以根据需要将新添加的文件列表返回到目录。我对新文件的定义是上次检查/扫描目录时不存在的文件。

我知道有 JNotify 等库和 java 目录监视服务http://docs.oracle.com/javase/tutorial/essential/io/notification.html。然而,据我了解,这些库实现了监听目录并在某些文件事件(添加、删除、删除等)发生时立即通知。但我需要的是一种按需将新添加的文件列表返回到目录的方法。

4

5 回答 5

1

您可以通过维护调用者的最后请求时间戳轻松实现此目的。然后将该时间戳传递给一个 java 类,该类将扫描目录以查找在该时间戳之后创建的文件。

就像是:

public List<File> getNewFiles(Date lastRequestedDate)
{
//Iterate the directory for files newer than the date passed in as parameter
}
于 2013-03-18T11:19:35.577 回答
1

有不同的方法。

方法一:文件创建日期

您可能想要列出所有文件并检查每个文件的创建时间戳。已经有关于这个话题的深入讨论。只需检查时间戳是否大于您上次检查目录时保存的时间戳。

方法二:创建和维护文件列表

如果您负担得起内存和时间,请在目录中创建文件列表。遍历目录并将列表中尚未包含的所有文件添加到另一个列表中。对它们做任何你需要做的事情,并将它们添加到你的主列表中。

您还应该在每次成功检查和处理文件后序列化您的主列表并将其保存到磁盘。

于 2013-03-18T11:19:49.263 回答
0

您可以维护文件名列表并检查新文件

于 2013-03-18T11:16:47.900 回答
0

您可以在单独的文件中维护文件指针。每次需要新/旧文件时,您都可以传递到以下方法。

package test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;

import org.apache.commons.io.comparator.LastModifiedFileComparator;
import org.apache.commons.io.filefilter.AgeFileFilter;

public class AgeFileFilterTest {

    public static void main(String[] args) throws IOException {
    String directoryPath = "/home/vikas";
    String fileName = "fileName";
    File directory = new File(directoryPath);


    File[] files = directory.listFiles();
    System.out.println("\nBefore ");
    displayFiles(directory, new AgeFileFilter(new File(directoryPath+FileName) , true));
    System.out.println("\nAfter " );
    displayFiles(directory, new AgeFileFilter(new File(directoryPath+FileName),false));

}

public static void displayFiles(File directory, FileFilter fileFilter) {
    File[] files = directory.listFiles(fileFilter);
    Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
    for (File file : files) {
        Date lastMod = new Date(file.lastModified());
        System.out.println("File: " + file.getName() + ", Date: " + lastMod + "");
    }
}

}

于 2014-06-11T09:23:34.340 回答
0

我建议您使用 Java 目录监视服务。实施监视服务应该相当快。让它在后台运行;它将继续排队事件 - add, remove, delete- 当它们发生时。每当您的按需 API 需要已添加的文件列表时,您只需执行以下操作:

  • 轮询到目前为止已排队的所有事件
  • 遍历它们,查找add事件类型并创建要返回的列表
  • 清除您已投票的事件,以便它们不会出现在下一次投票中(有一个resetAPI 可以执行此操作)

这种方法的好处是:

  1. 更少的问题:您必须扫描目录并跟踪添加的文件;Java 会为您执行此操作,因此该部分不会有任何错误。
  2. 更少的内存消耗:使用时间戳方法,您将获得自上次扫描以来已修改的文件,因此您必须保留遇到的所有文件的列表以识别已添加的文件。但是使用目录监视服务,您将不得不维护任何此类数据结构。
  3. 更好的性能:在按需方法执行期间,您不会执行目录列表或文件名比较;您只需遍历已排队的事件并创建返回值。
于 2013-03-20T16:31:28.643 回答