JavaFX – как добавить все файлы из каталога в TableView

Название говорит все. Я хочу, чтобы каталог файлов читался, а затем записывался в TableView. Как это сделать? Я думал о том, чтобы обрабатывать файлы и папки в выбранном каталоге как массив, а затем открывать и добавлять их по одному в сквозном цикле, но я не знаю, как перевести это в java, стандартные библиотеки не включают полезные методы, кроме открытия одного файла/каталога .


person Michał Bil    schedule 25.09.2014    source источник
comment
Вы хотите, чтобы таблица отображала список файлов? Или содержимое файлов каким-то образом?   -  person James_D    schedule 25.09.2014
comment
Да, сейчас я пишу музыкальный проигрыватель на JavaFX, так что дело в этом. Я хочу щелкнуть в DirectoryChooser в папке «Музыка», а затем добавить каждую подпапку с mp3.   -  person Michał Bil    schedule 25.09.2014


Ответы (1)


Если вы просто хотите получить файлы в каталоге:

TableView<File> table = new TableView<>();
// configure table columns etc
File dir = ... ;
table.getItems().addAll(dir.listFiles());

Если вы хотите рекурсивно проходить подкаталоги (до заданной глубины), используйте API java.nio:

TableView<Path> table = new TableView<>();
// configure table columns etc

File fileDir = directoryChooser.showDialog(mainStage);
if (fileDir != null) { // if the user chose something:
    Path dir = fileDir.toPath() ;
    int depth = ... ; // maximum depth to search, use Integer.MAX_VALUE to search everything
    Files.find(dir, depth, (path, attributes) -> 
        path.getFileName().toString().toLowerCase().endsWith(".mp3")) // select only mp3 files
        .forEach(table.getItems()::add);
}

В последнем (длинном) выражении Files.find(...) выдает (Java 8) Stream<Path>. Код вызывает forEach(...) в этом потоке, чтобы добавить каждый элемент в items в табличном представлении.

person James_D    schedule 25.09.2014
comment
Но где я должен назначить переменную File, в которой хранится выбранный каталог? - person Michał Bil; 26.09.2014
comment
Везде, где вам это нужно. Я не уверен, что понимаю вопрос. - person James_D; 26.09.2014
comment
По второму, рекурсивному методу. Я не вижу никакой файловой переменной. Извините за глупый вопрос, но этот API совершенно новый для меня. Это похоже на то, что я открываю каталог в DirectoryChooser, затем запускаю этот метод Files.find и все? - person Michał Bil; 26.09.2014
comment
В API java.nio используйте Path вместо File. File определяет метод toPath() (и наоборот), поэтому вы можете выполнять File file = directoryChooser.showDialog(...); и if (file != null) { Path dir = file.toPath(); ...} - person James_D; 26.09.2014
comment
Спасибо, теперь мне понятно. Еще одна вещь, прежде чем я добавлю файл в TableView, мне нужно получить некоторые метаданные mp3, такие как исполнитель, название альбома и т. д., из метода. Для этого я должен иметь каждый файл в типе файла. Как снова вернуть каждый найденный элемент .find из типа пути в файл? Я знаю, что этим можно управлять с помощью метода .toFile, но в вашем коде я не могу найти место для его размещения. - person Michał Bil; 27.09.2014
comment
Files.find(...).map(Path::toFile) преобразует Stream<Path> в Stream<File>. Затем вы можете вызвать forEach(...) и работать с каждым File. - person James_D; 27.09.2014