Листинг только файлов в каталоге

У меня есть папка со следующей структурой

C:/rootDir/

rootDir has following files

test1.xml
test2.xml
test3.xml
testDirectory <------- This is a subdirectory inside rootDir

Меня интересуют только файлы xml внутри rootDir. Cuz Если я использую JDOM для чтения XML, следующий код также рассматривает файлы внутри "testDirectory" и выплевывает "недопустимое исключение контента"

File testDirectory = new File("C://rootDir//");
File[] files = testDirectory.listFiles();

как я могу исключить подкаталог при использовании метода listFiles? Будет ли работать следующий код?

File testDirectory = new File("C://rootDir//");
File[] files = testDirectory.listFiles(new FilenameFilter() {

    @Override
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".xml");
    }
});

Ответ 1

Используйте FileFilter, так как он предоставит вам доступ к фактическому файлу, затем включит проверку File#isFile

File testDirectory = new File("C://rootDir//");
File[] files = testDirectory.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        String name = pathname.getName().toLowerCase();
        return name.endsWith(".xml") && pathname.isFile();
    }
});

Ответ 2

Легче понять, что объект File имеет метод isDirectory, который кажется, что он был написан, чтобы ответить на этот вопрос:

File testDirectory = new File("C://rootDir//");
File[] files = testDirectory.listFiles();
for (File file : files) {
    if ( (file.isDirectory() == false) && (file.getAbsolutePath().endsWith(".xml") ) {
       // do what you want
    }
}

Ответ 3

File testDirectory = new File("C://rootDir//");
File[] files = testDirectory.listFiles(new FilenameFilter()
 {

    @Override
    public boolean accept(File dir, String name) {
        return name.toLowerCase().endsWith(".xml");
    }});

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

FileFilter также делает то же самое, но он будет использоваться, когда имя файла недостаточно для указания файлов. Если вы хотите перечислить все скрытые файлы или файл readonly и т.д., вы можете использовать FilteFilter