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