2013-03-18 112 views
0

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

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

+1

新相比有什么补充?自上次运行以来创建? “新加入”是什么意思? – david99world 2013-03-18 11:14:59

+0

@ david99world正如我所说的那样:“新加入的是最后一次调用时不存在的那个,即检查/扫描目录 – Nadeem 2013-03-18 13:03:52

回答

0

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

+2

不需要维护文件列表您可以在最后一次请求时存储时间戳,然后返回 – Manish 2013-03-18 11:18:02

+0

@Manish是的,这是一个好主意 – 2013-03-18 11:24:47

1

您可以通过保持最后的请求时间戳和呼叫者轻松实现这一点。然后将该时间戳传递给一个java类,该类将扫描目录以查找该时间戳后创建的文件。

喜欢的东西:

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

Manish感谢这个想法,实际上我正在寻找一些已经完成的工作的链接,并且将它重新用于我自己的工作,广告重用是一种很好的做法。但是如果我没有及时得到它,那么搜索过程可能比它节省的时间要长。 – Nadeem 2013-03-18 12:58:53

1

有不同的做法。

方法之一:文件创建日期

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

方法二:创建和维护文件

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

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

0

我建议你去用Java目录观看服务。实施监视服务应该相当快。让它在后台运行;它将保持排队事件 - add,remove,delete - 当它们发生时。每当您点播API需要已添加的文件列表,你只需要做到以下几点:

  • 调查所有已到目前为止
  • 在它们之间迭代排队的事件,寻找add事件类型和创建列表中返回
  • 清楚你有调查让他们不要在未来的调查可能出现的事件(有一个reset API来做到这一点)

好处这种方法将是:

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

}