2010-11-10 53 views
5

我正在使用java的windows版本的桌面應用程序中工作。在我的應用程序中,需要從本地系統的MyDocuments/Documents(按照O.S.)搜索所有.doc和.docx文件,並顯示名稱和文件大小。Java代碼來搜索本地系統中的所有.doc和.docx文件

我沒有找到幫助我列出所有* .doc,* .docx,* .xls,* .xlsx,* .csv,* .txt,* .pdf,* .ppt的方式,Documents/MyDocuments中存在的* .pptx文件。

請給我你的寶貴意見或建議我任何鏈接,這將有助於我編寫快速搜索的代碼,並列出它的名稱,大小和類型。

回答

8

您可以使用Apache Commons IO,特別是FileUtils類。這將使類似:

import java.io.File; 
import java.util.Collection; 

import org.apache.commons.io.*; 
import org.apache.commons.io.filefilter.*; 

public class SearchDocFiles { 
    public static String[] EXTENSIONS = { "doc", "docx" }; 

    public Collection<File> searchFilesWithExtensions(final File directory, final String[] extensions) { 
     return FileUtils.listFiles(directory, 
       extensions, 
       true); 
    } 

    public Collection<File> searchFilesWithCaseInsensitiveExtensions(final File directory, final String[] extensions) { 
     IOFileFilter fileFilter = new SuffixFileFilter(extensions, IOCase.INSENSITIVE); 
     return FileUtils.listFiles(directory, 
       fileFilter, 
       DirectoryFileFilter.INSTANCE); 
    } 


    public static void main(String... args) { 
     // Case sensitive 
     Collection<File> documents = new SearchDocFiles().searchFilesWithExtensions(
       new File("/tmp"), 
       SearchDocFiles.EXTENSIONS); 
     for (File document: documents) { 
      System.out.println(document.getName() + " - " + document.length()); 
     } 

     // Case insensitive 
     Collection<File> caseInsensitiveDocs = new SearchDocFiles().searchFilesWithCaseInsensitiveExtensions(
       new File("/tmp"), 
       SearchDocFiles.EXTENSIONS); 
     for (File document: caseInsensitiveDocs) { 
      System.out.println(document.getName() + " - " + document.length()); 
     } 
    } 
} 
+0

我不確定它會找到像「test.DOC」這樣的文件... – khachik 2010-11-10 11:53:18

+0

@khachik您可以忽略案件或大小寫,如你所需。 – 2010-11-10 12:02:30

0

您可能想要考慮使用 Apache POI提取MSWord文本並通過 Lucene(爲了準確性,靈活性和搜索速度)將它們編制索引。 Nutch和Solr都有用於Lucene的助手庫,您可以使用它來加快速度(也就是說,如果Lucene內核不夠用)。

[更新]我誤解了原來的問題(更新之前)。你只需要使用Java搜索文件系統? Java API可以做到這一點。 Apache還有一個library (Commons IO),其中包含一個文件實用程序,用於列出目錄下的所有文件,包括提供過濾器的子目錄。我之前使用過它,例如FileUtils.listFiles(dir,filefilter,dirfilter)或FileUtils.listFiles(dir,extensions [],遞歸)。然後從該列表中執行您的搜索功能。

1

如果你想找到所有擴展名爲.doc文件(x)的擴展,可以使用java.io.File.list(的FileFilter)方法,說:

 
public java.util.List mswordFiles(java.io.File dir) { 
    java.util.List res = new java.util.ArrayList(); 
    _mswordFiles(dir, res); 
    return res; 
} 
protected void _mswordFiles(java.io.File dir, java.util.List res) { 
    java.io.File [] files = dir.listFiles(new java.io.FileFilter() { 
     public boolean accept(java.io.File f) { 
      String name = f.getName().toLowerCase(); 
      return !f.isDirectory() && (name.endsWith(".doc") || name.endsWith(".docx")); 
     } 
    }); 
    for(java.io.File f:files) {res.add(f);} 
    java.io.File [] dirs = dir.listFiles(new java.io.FileFilter() { 
     public boolean accept(java.io.File f) { 
      return f.isDirectory(); 
     } 
     }); 
    for(java.io.File d:dirs) {_mswordFiles(d, res);} 
} 

2

檢查此方法。

public void getFiles(String path) { 
    File dir = new File(path); 
    String[] children = dir.list(); 
    if (children != null) { 
     for (int i = 0; i < children.length; i++) { 
      // Get filename of file or directory 
      String filename = children[i]; 
      File file = new File(path + File.separator + filename); 
      if (!file.isDirectory()) { 
       if (file.getName().endsWith(".doc") || file.getName().endsWith(".docx")) { 
        System.out.println("File Name " + filename + "(" + file.length()+" bytes)"); 
       } 
      } else { 
       getFiles(path + File.separator + filename); 
      } 
     } 
    } 
} 
1

我沒有足夠的信譽評論等有提交此爲「答案」:

@khachik可以忽略大小寫或大/小寫,因爲你需要。 - 的Martijn Verburg 11月10日在'10 12:02

這花了我有點找出並終於找到了如何忽略大小寫這種解決方案:

添加

public static final IOFileFilter filter = new SuffixFileFilter(EXTENSIONS, IOCase.INSENSITIVE);

然後修改searchFilesWithExtensions方法爲return FileUtils.listFiles( directory, filter, DirectoryFileFilter.DIRECTORY);