Java-код для поиска всех файлов .doc и .docx из локальной системы - PullRequest
5 голосов
/ 10 ноября 2010

Я работаю в настольном приложении для Windows версии с использованием Java. В моем приложении есть требование искать все файлы .doc и .docx из MyDocuments / Documents (согласно O.S.) из локальной системы и отображать там имя и размер файла.

Я не понимаю, как мне помочь перечислить все * .doc, * .docx, * .xls, * .xlsx, * .csv, * .txt, * .pdf, * .ppt, * .pptx файлы, представленные в Documents / MyDocuments.

Пожалуйста, дайте мне ваши ценные предложения или предложите мне любую ссылку, которая поможет мне в написании кода для ускорения поиска и вывода списка с его именем, размером и типом.

Ответы [ 5 ]

8 голосов
/ 10 ноября 2010

Вы можете использовать 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());
        }
    }
}
2 голосов
/ 10 ноября 2010

Проверьте этот метод.

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 голос
/ 15 января 2014

У меня недостаточно репутации, чтобы комментировать, поэтому я должен отправить это как 'ответ':

@ khachik Вы можете игнорировать регистр или верхний / нижний регистр по мере необходимости.- Мартин Вербург 10 ноября 2010 года в 12: 02

Мне понадобилось немного времени, чтобы разобраться и, наконец, найти способ игнорировать регистр с этим решением:

Добавить

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

Затем измените метод searchFilesWithExtensions на return FileUtils.listFiles( directory, filter, DirectoryFileFilter.DIRECTORY );

1 голос
/ 10 ноября 2010

Если вы хотите найти все файлы с расширениями .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);}
}
0 голосов
/ 10 ноября 2010

Возможно, вы захотите изучить извлечение текста MSWord с помощью Apache POI и индексацию их с помощью Lucene (для точности, гибкости и скорости поиска).У Nutch и Solr есть вспомогательные библиотеки для Lucene, которые можно использовать для ускорения работы (то есть, если ядра Lucene недостаточно).

[update] Я неправильно понял исходный вопрос (до обновления).Вам просто нужно искать файловую систему с помощью Java ??Java API может сделать это.Apache также имеет библиотеку (Commons IO) , которая включает в себя файловую утилиту для отображения всех файлов в каталоге, включая его подкаталоги с указанным фильтром.Я использовал его раньше, например, FileUtils.listFiles (dir, filefilter, dirfilter) или FileUtils.listFiles (dir, extensions [], рекурсивный).Затем выполните функцию поиска из этого списка.

...