Исключение IOException при передаче Filefilter в качестве аргумента

#java #exception #ioexception #filefilter

#java #исключение #исключение ioexception #filefilter

Вопрос:

У меня возникает эта странная проблема, когда я выполняю этот фрагмент кода:

 cdrFiles = dir.list(filter);
System.out.println("cdrFiles length: "   cdrFiles.length);
if (cdrFiles.length >= 1) {
    System.out.println("there is 1 or more files");
}else{
    throw new IOException("1No files in dir: "   directory   " that match the correct pattern");
}
  

Каталог здесь содержит 1 файл, который соответствует фильтру.

Вывод:

 cdrFiles length: 0
java.io.IOException: 1No files in dir: cdrs that match the correct pattern
  

Когда я комментирую исключение:

 cdrFiles = dir.list(filter);
System.out.println("cdrFiles length: "   cdrFiles.length);
if (cdrFiles.length >= 1) {
    System.out.println("there is 1 or more files");
}else{
    //throw new IOException("1No files in dir: "   directory   " that match the correct pattern");
}
  

Я получаю этот вывод:

 cdrFiles length: 1
there is 1 or more files
  

Кто-нибудь знает, как это возможно?

Редактировать:

Это код для фильтра:

 String[] cdrFiles = collectCdrFiles(directory, new FilenameFilter() {

    public boolean accept(File dir, String name) {
        System.out.println(name   "t"   name.matches("call_history_[0-9]{8}_[0-9]{8}_[0-9]{3}_answer.*.csv"));
        return name.matches("call_history_[0-9]{8}_[0-9]{8}_[0-9]{3}_answer.*.csv"));
    }
});
  

С первым кодом имя файла не печатается.
Со вторым кодом это так (даже проверено, соответствует ли оно -> да)

Файл в каталоге:

 call_history_20111001_20111031_465_answer.csv
  

Функция collectCdrFiles выглядит следующим образом:

 protected String[] collectCdrFiles(String directory, FilenameFilter filter) throws IOException {
    //open cdr directory
    String[] cdrFiles;
    File dir = new File(directory);
    //get cdr files
    if (dir.exists()) {
        cdrFiles = dir.list(filter);
        System.out.println("cdrFiles length: "   cdrFiles.length);

        if (cdrFiles.length >= 1) {
            System.out.println("there is 1 or more files");
        }else{
            throw new IOException("1No files in dir: "   directory   " that match the correct pattern");
        }
    } else {
        throw new IOException("Directory: "   directory   " doesn't exist.");
    }
    return cdrFiles;
}
  

та же проблема с этим кодом:

 if (cdrFiles.length >= 1) {
    System.out.println("there is 1 or more files");
}
if(cdrFiles.length == 0){    
    throw new IOException("1No files in dir: "   directory   " that match the correct pattern");
}
  

SSCCEE:

 public static void main(String[] args) throws IOException {
    String[] cdrFiles;
    File dir = new File("testfolder");
    //get cdr files
    if (dir.exists()) {
        cdrFiles = dir.list(new FilenameFilter() {

        public boolean accept(File dir, String name) {
        System.out.println(name   "t"   name.matches("call_history_[0-9]{8}_[0-9]{8}_[0-9]{3}_answer.*\.csv"));
        return name.matches("call_history_[0-9]{8}_[0-9]{8}_[0-9]{3}_answer.*\.csv");
        }
    });
        System.out.println("cdrFiles length: "   cdrFiles.length);

        if (cdrFiles.length >= 1) {
        System.out.println("there is 1 or more files");
        }
        if(cdrFiles.length == 0){        
        throw new IOException("1No files in dir: "   dir.getName()   " that match the correct pattern");
        }
    } else {
        throw new IOException("Directory: "   dir.getName()   " doesn't exist.");
    }
    }
}
  

Комментарии:

1. Нет, это изменение не приводит к этой разнице, если не выполняется какой-либо рекурсивный вызов. Пожалуйста, опубликуйте больше кода. Например, какое значение / код стоит за filter этим?

2. Я все еще подозреваю, что что-то еще изменилось. Когда вы повторно включаете исключение, Очищаете свое рабочее пространство (т. Е. Удаляете все .class файлы) и выполняете полную перестройку, Остается ли результат по-прежнему 0?

3. @Berty пожалуйста, опубликуйте свой main метод

4. @Joachim я уже пробовал чистую сборку, все еще 0

5. @Woot4Moo приложение имеет графический интерфейс. основной метод находится довольно далеко, и между ними сотни строк кода

Ответ №1:

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

 import java.io.*;

public class filetest {

public static void main(String [] m) throws IOException {

String directory = "c://dev//";

filetest t = new filetest();
String[] cdrFiles = t.collectCdrFiles(directory, new FilenameFilter() {

    public boolean accept(File dir, String name) {
        System.out.println(name   "t"         name.matches("call_history_20111001_20111031_465_answer.csv"));
        return name.matches("call_history_20111001_20111031_465_answer.csv");
    }
});
  

}

 protected String[] collectCdrFiles(String directory, FilenameFilter filter) throws     IOException {
  //open cdr directory
   String[] cdrFiles;
  File dir = new File(directory);
   //get cdr files
   if (dir.exists()) {
       cdrFiles = dir.list(filter);
       System.out.println("cdrFiles length: "   cdrFiles.length);

       if (cdrFiles.length >= 1) {
           System.out.println("there is 1 or more files");
       }else{
           throw new IOException("1No files in dir: "   directory   " that match  the    correct pattern");
      }
   } else {
    throw new IOException("Directory: "   directory   " doesn't exist.");
   }
  return cdrFiles;
  

}
}

Вот результат:

C:Usersjava >java filetest call_history_20111001_20111031_465_answer.csv true DB false cdrФайлы длина: 1 существует 1 или более файлов

C:Usersjava >

Ответ №2:

Скомпилировано с использованием JRockit, который поставляется в комплекте с Weblogic 10.3.4

 import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

public class Test {

    public static void main(String[] args) throws IOException {

        String directory = "C:\Test";
        String[] cdrFiles = collectCdrFiles(directory, new FilenameFilter() {
            public boolean accept(File dir, String name) {
                System.out
                        .println(name
                                  "t"
                                  name
                                        .matches("call_history_[0-9]{8}_[0-9]{8}_[0-9]{3}_answer.*\.csv"));
                return name
                        .matches("call_history_[0-9]{8}_[0-9]{8}_[0-9]{3}_answer.*\.csv");
            }
        });
    }

    static protected String[] collectCdrFiles(String directory,
            FilenameFilter filter) throws IOException { // open cdr directory
        String[] cdrFiles;
        File dir = new File(directory); // get cdr files
        if (dir.exists()) {
            cdrFiles = dir.list(filter);
            System.out.println("cdrFiles length: "   cdrFiles.length);
            if (cdrFiles.length >= 1) {
                System.out.println("there is 1 or more files");
            } else {
                throw new IOException("1No files in dir: "   directory
                          " that match the correct pattern");
            }
        } else {
            throw new IOException("Directory: "   directory   " doesn't exist.");
        }
        return cdrFiles;
    }
}
  

вывод:

 call_history_20111001_20111031_465_answer.csv   true
cdrFiles length: 1
there is 1 or more files
  

Ответ №3:

ОТВЕТ

Я исправил проблему. Не знаю почему, но когда я передаю фильтр в качестве аргумента, он терпит неудачу. Все остальные способы (встроенный или отдельный класс) работают с идентичным кодом

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

 cdrFiles = collectCdrFiles(directory, new CdrFilenameFilterUnifiedTelecom().getClass());
  

и в функции я создаю экземпляр класса:

 cdrFiles = dir.list((FilenameFilter)filter.newInstance());
  

ужасно, но это работает ^^

спасибо за помощь, ребята