Найти первый файл в каталоге с Java - PullRequest
3 голосов
/ 18 августа 2011

У меня есть какая-то пакетная программа, которая должна взять файл из каталога и обработать его.

Так как эта программа должна:

  • запустить на JDK 5,
  • быть маленьким (без внешних библиотек)
  • и быстро! (с треском)

... Каков наилучший способ выбрать только один файл из каталога - без использования File.list() (может быть, сотни файлов)?

Ответы [ 6 ]

7 голосов
/ 18 августа 2011

В Java 7 вы можете использовать DirectoryStream , но в Java 5 единственными способами получить записи каталога являются list() и listFiles().

Обратите внимание, что перечисление каталога с сотнями файлов не является идеальным, но все же, вероятно, не имеет большого значения по сравнению с обработкой одного из файлов. Но это, вероятно, станет проблематичным, если каталог будет содержать тысячи файлов.

2 голосов
/ 18 августа 2011

Судя по тому, что вы сказали, вы хотите обработать каждый файл в каталоге один раз (включая файлы, которые добавляются в каталог). Вы можете сделать следующее: установить монитор в каталоге, который генерирует уведомления при добавлении файлов. Затем вы обрабатываете каждый файл, о котором получаете уведомление. Поскольку вы используете JDK 5, я предлагаю использовать jpathwatch . обратите внимание, что вы должны убедиться, что запись файла завершена, прежде чем пытаться его обработать. после запуска монитора, чтобы убедиться, что вы будете обрабатывать каждый новый файл, выполните одноразовое использование списка файлов для обработки текущего содержимого.

1 голос
/ 18 августа 2011

Используйте FileFilter (или FilenameFilter), написанное для принятия только один раз, например:

File dir = new File("/some/dir");
File[] files = dir.listFiles(new FileFilter() {
    boolean first = true;
    public boolean accept(final File pathname) {
        if (first) {
            first = false;
            return true;
        }
        return false;
    }
});
0 голосов
/ 18 августа 2011

Если взглянуть на класс класса FileSystem, к которому он сводится, для доступа к файловой системе, то есть только метод list, поэтому в «чистой» JAVA нет другого способа выбрать файл, кроме как перечислить их все в String массив.

0 голосов
/ 18 августа 2011

Редактировать: Моя реализация использовала .list (), как вы сказали, что это не так, но в любом случае она может содержать некоторое значение:)

Если вы посмотрите на публичную реализацию File String [] list ()метод, кажется, имеет меньше накладных расходов, чем File [] listFiles ().Так что самый быстрый должен быть

String[] ss = myDir.list();
File toProcess = null;
for(int i = o ; i< ss.length ; i++){
 toProcess = new File(myDir.list()[i], myDir));
 if(toProcess.isFile())break;
}

Из File.class

public File[] listFiles() {
String[] ss = list();
if (ss == null) return null;
int n = ss.length;
File[] fs = new File[n];
for (int i = 0; i < n; i++) {
    fs[i] = new File(ss[i], this);
}
return fs;
}
0 голосов
/ 18 августа 2011

Здесь нет хорошего решения для Java 1.5, вы можете использовать фильтр, чтобы получить только 1 файл, но тогда java вернет только один файл, но все равно проанализирует их.Если вам не нужен фактический объект файла, вы можете попробовать что-то вроде Runtime.getRuntime().exec("dir"), разделить возвращенную строку на \n и распечатать первую строку: -P

...