#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());
ужасно, но это работает ^^
спасибо за помощь, ребята