2014-02-25 62 views
0

我必须从与给定模式匹配的文件夹中分离出这些文件。我有一个包含这些模式的字符串数组。
我将这个数组作为参数传递给WildCardFilter,这样我就可以分离出与数组中给定模式相匹配的文件。我的代码如下。在java中的WildcardFileFilter需要帮助

String pat1="DailyExistingBusinessReport_*"; 
String pat2="*DailyNewExistingBusinessReport_.csv"; 
String pat3="*_EOD_PNL_Explained.*"; 
String pat4="ABC*XYZ.csv"; 
String str[]=new String[]{pat1,pat2,pat3,pat4}; 
FileFilter fileFilter = new WildcardFileFilter(str); 
File dir = new File("\\C:\\Users\\ABC\\Desktop\\Myfiles"); 
File[] files = dir.listFiles(fileFilter); 

for(File f :files){ 
    System.out.println(f); 
} 

该打印出的文件相匹配的数组给定的模式的名称。但现在我的要求是与每个文件名一起,我需要该文件匹配的模式的确切名称。任何想法应该添加什么代码来获取模式名称和文件名。

+0

请格式化您的代码。帮助中心可以告诉你如何。 –

+0

什么是WildcardFileFilter?它不在标准API中。 – Boann

回答

1

我检查了API,没有看到用FileFilter这样做的方法。 我建议创建一个过滤器列表,并通过一个应用它们一个:

List<FileFilter> filters = new ArrayList<FileFilter>(); 
filters.add(new WildCardFileFilter("DailyExistingBusinessReport_*"); 
filters.add(new WildCardFileFilter("*DailyNewExistingBusinessReport_.csv"); 
filters.add(new WildCardFileFilter("*_EOD_PNL_Explained.*"); 
filters.add(new WildCardFileFilter("ABC*XYZ.csv"); 

File dir = new File("\\C:\\Users\\ABC\\Desktop\\Myfiles"); 
Map<FileFilter, List<File>> filemap = new HashMap<FileFilter, List<File>>(); 

for (File file: dir.listFiles()){ 
    for(FileFilter filter: filters){ 
     if(filter.accept(file)){ 
      if(!filemap.containsKey(filter)){ 
       filemap.put(filter, new ArrayList<File>()); 
      } 
      filemap.get(filter).add(file); 
     } 
    } 
} 

之后,你应该有一个地图,包含文件的过滤器,并列出了该过滤器适用。 我手头没有IDE,所以可能会有一些小错误。

+0

我的确如你所写的一样,但它涉及两个循环,文件数量很大。这会使程序效率低下。 – Vaibhav

+1

我不认为你可以找到比这更有效的方法。您只遍历文件一次,为了保持一致,您必须检查每个文件的所有过滤器(某些文件可能应用于多个过滤器)。试着检查'''File.listFiles(FileFilter filter)'''的来源,也许我错了。顺便说一句,感谢Boann的修复:) – NeplatnyUdaj