【问题标题】:Java: Get a list of new files from a directoryJava:从目录中获取新文件的列表
【发布时间】:2013-03-06 16:58:57
【问题描述】:

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

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

【问题讨论】:

  • 新增对比什么?自上次运行以来创建?您所说的“新添加”到底是什么意思?
  • @david99world 正如我所说“新添加的是上次调用时不存在的目录,即检查/扫描目录

标签: java file file-io monitor


【解决方案1】:

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

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 + "");
    }
}

}

【讨论】:

    【解决方案2】:

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

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

    这种方法的好处是:

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

    【讨论】:

      【解决方案3】:

      有不同的方法。

      方法一:文件创建日期

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        类似:

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

        【讨论】:

        • Manish 感谢这个想法,实际上我正在寻找一些已经完成的工作的链接,并将其重用于我自己的工作。广告重用是一种很好的做法。但是如果我没有及时得到它,那么搜索过程可能需要比它保存的时间更长的时间。 :)
        【解决方案5】:

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

        【讨论】:

        • 无需维护文件列表。您可以只存储上次请求时的时间戳,然后返回比时间戳更新的文件列表。
        猜你喜欢
        • 1970-01-01
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        相关资源
        最近更新 更多