IOException при передаче Filefilter в качестве аргумента - PullRequest
0 голосов
/ 03 ноября 2011

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

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.");
    }
    }
}

Ответы [ 3 ]

1 голос
/ 03 ноября 2011

Скомпилировано с 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
1 голос
/ 20 ноября 2011

ОТВЕТ

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

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

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

и в функции i instanciateкласс:

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

ужасен до чертиков, но работает ^^

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

1 голос
/ 03 ноября 2011

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

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: \ Users \ java> java filetest call_history_20111001_20111031_465_answer.csv true БД false cdrFiles длина: 1 существует 1 или более файлов

C: \ Users \ java>

...