Java:从目录中获取新文件列表

时间:2013-03-18 11:13:31

标签: java file file-io monitor

我需要一个java程序,根据需要将新添加的文件列表返回到目录。我对新文件的定义是最后检查/扫描目录时没有的文件。

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

5 个答案:

答案 0 :(得分:1)

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

类似的东西:

public List<File> getNewFiles(Date lastRequestedDate)
{
//Iterate the directory for files newer than the date passed in as parameter
}

答案 1 :(得分:1)

有不同的方法。

方法一:文件创建日期

您可能希望列出所有文件并检查每个文件的创建时间戳。已经有deep discussion on this topic了。只需检查时间戳是否大于上次检查目录时保存的时间戳。

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

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

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

答案 2 :(得分:0)

您可以维护文件名列表,并针对新文件进行检查

答案 3 :(得分:0)

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

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

这种方法的好处是:

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

答案 4 :(得分: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 + "");
    }
}

}