java代码从本地系统搜索所有.doc和.docx文件

时间:2010-11-10 11:17:04

标签: java swing search desktop-application

我在使用java的Windows版桌面应用程序中工作。在我的应用程序中,需要从本地系统中搜索MyDocuments / Documents(根据O.S.)的所有.doc和.docx文件,并显示名称和文件大小。

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

请给我你宝贵的建议或建议我任何链接,以帮助我编写代码,以便更快地搜索和列出其名称,大小和类型。

5 个答案:

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

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

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

答案 3 :(得分:1)

我没有足够的声誉来发表评论,因此必须将其作为“回答”提交:

  

@khachik您可以根据需要忽略案例或大写/小写。 - Martijn Verburg 2010年11月10日12:02

这让我想了一下,最后找到了如何忽略这个解决方案的情况:

添加

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

然后将searchFilesWithExtensions方法修改为return FileUtils.listFiles( directory, filter, DirectoryFileFilter.DIRECTORY );

答案 4 :(得分: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 [],递归)。然后从该列表中执行搜索功能。