【问题标题】:java code to search all .doc and .docx files from local system用于从本地系统搜索所有 .doc 和 .docx 文件的 java 代码
【发布时间】:2011-05-07 19:56:21
【问题描述】:

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

我没有找到可以帮助我列出所有 *.doc、*.docx、*.xls、*.xlsx、*.csv、*.txt、*.pdf、*.ppt、 *.pptx 文件存在于 Documents/MyDocuments 中。

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

【问题讨论】:

    标签: java swing search desktop-application


    【解决方案1】:

    您可以使用 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());
            }
        }
    }
    

    【讨论】:

    • @khachik 您可以根据需要忽略大小写或大小写。
    【解决方案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);
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      公共 java.util.List mswordFiles(java.io.File dir) { java.util.List res = new java.util.ArrayList(); _mswordFiles(dir, res); 返回资源; } 受保护的无效_mswordFiles(java.io.File dir,java.util.List res){ java.io.File [] files = dir.listFiles(new java.io.FileFilter() { 公共布尔接受(java.io.File f){ 字符串名称 = f.getName().toLowerCase(); 返回 !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() { 公共布尔接受(java.io.File f){ 返回 f.isDirectory(); } }); for(java.io.File d:dirs) {_mswordFiles(d, res);} }

      【讨论】:

        【解决方案4】:

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

        @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 );

        【讨论】:

          【解决方案5】:

          您可能希望研究使用Apache POI 提取MSWord 文本并通过Lucene 对其进行索引(以提高搜索的准确性、灵活性和速度)。 Nutch 和 Solr 都有 Lucene 的帮助程序库,您可以使用它来加快速度(也就是说,如果 Lucene 核心不够用)。

          [更新] 我误解了原来的问题(更新前)。您只需要使用 Java 搜索文件系统? Java API 可以做到这一点。 Apache 还有一个library (Commons IO),它包括一个文件实用程序,用于列出一个目录下的所有文件,包括给定过滤器的子目录。我以前用过,例如FileUtils.listFiles(dir, filefilter, dirfilter) 或 FileUtils.listFiles(dir, extensions[], recursive)。然后从该列表中执行搜索功能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-07-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多