Код: Выделить всё
private void selectPrimaryFolder(ResourceBundle resourceBundle, ListView lvFileList) {
DirectoryChooser chooser = new DirectoryChooser();
chooser.setTitle(resourceBundle.getString("selectPrimaryFolder"));
File selectedDirectory = chooser.showDialog((Stage) btnSelectPrimaryFolder.getScene().getWindow());
System.out.println("SELECTED DIRECTORY: " + selectedDirectory.toPath());
// TODO
try (Stream
stream = Files.walk(selectedDirectory.toPath()).sorted()) {
stream.forEach(path -> addFileToList(path.toFile(), lvFileList));
} catch (IOException ioException) {
ioException.getMessage();
}
/*System.out.println(listFileTree(selectedDirectory));
for (File f: listFileTree(selectedDirectory)){
lvFileList.getItems().add(f.getName());
}*/
}
private static void addFileToList(File file, ListView lvFileList) {
if (file.isDirectory()) {
System.out.println("Directory: " + file.getAbsolutePath());
} else {
System.out.println("File: " + file.getAbsolutePath());
lvFileList.getItems().add(file.getName());
}
}
public static Collection listFileTree(File dir) {
Set fileTree = new HashSet();
if(dir==null||dir.listFiles()==null){
return fileTree;
}
for (File entry : dir.listFiles()) {
if (entry.isFile()) fileTree.add(entry);
else fileTree.addAll(listFileTree(entry));
}
return fileTree;
}
Метод listFileTree(), который я нашел здесь (рекурсивный список файлов в Java), — это еще один способ, которым я пытался получить список файлов, но как ни странно, он игнорирует файлы которые содержат любые символы кириллицы.
Согласно сообщению здесь (оба File.isFile() и File.isDirectory() возвращают false), isFile() может иметь проблема с кодировкой.
Кодировка
Судя по тому, что я нашел, это может быть проблема с кодировкой.
Я проверил свой Настройки кодировки файлов IntelliJ, и все они настроены на UTF-8 (он также настроен на создание файлов UTF-8 без спецификации), включая кодировку консоли по умолчанию.
Я установил оба из них в VMOptions:
Код: Выделить всё
-Dconsole.encoding=UTF-8
-Dfile.encoding=UTF-8
Я столкнулся с чем-то интересным: если я использую FileChooser и выбираю один файл, символы правильно отображаются в ListView (хотя в консоли они по-прежнему отображаются в виде вопросительных знаков).
Согласно документации, File.walk() возвращает поток (путь), который Я предполагаю, что это делается через однобайтовый поток (признаюсь, я немного потерялся в документации), потому что, согласно комментарию Теда Хоппа в разделе «Поток байтов против потока символов в Java», он должен иметь возможность читать Кириллица, если это был «Поток символов» (конечно, при условии, что исходный файл имеет кодировку UTF-8).
...Чтобы проверить это, попробуйте файл, который содержит что-то, что для представления требуется более
более одного байта (например, греческие, кириллические или арабские
символы). С байт-ориентированным потоком это не сработает. В
потоке, ориентированном на символы, символы будут сохраняться до тех пор, пока
оба потока используют кодировки, поддерживающие эти символы
(например, UTF-8), и входной файл был сохранен. в кодировке, используемой для
входящего потока...
Выяснение исходной кодировки файла
Я подумал, что просто поищу способ обнаружить кодировку и установил условие, но после прочтения многих, многих, многих ответов выяснилось, что это невозможно сделать. Лучший вариант — попытаться «угадать». Что я и сделал.
Используя новую строку (bytes, charset)/String.getBytes(), упомянутую в разделе «Преобразование кодировки в Java», я протестировал наиболее распространенные из них, как показано ниже. вопрос (Какова наиболее распространенная кодировка каждого языка?), через File.walk().
НИ ОДИН ИЗ НИХ НЕ РАБОТАЕТ! Каждый один из них привел к появлению вопросительных знаков в консоли и в ListView.
Я думал, что в моих файлах могут быть ошибки, но у VLC, похоже, нет проблем с кодированием. Весь текст представлен так, как должен.
Вопрос
Как мне это сделать? Существует ли рекурсивный поток символов, альтернативный File.walk()? Я что-то еще пропустил?
P.S. Я не пробовал никаких нерекурсивных решений, поскольку рекурсия является обязательным требованием.
P.S. 2. Я также пробовал те, что упомянуты в io-recurse-tests, но увы, ничего.
Подробнее здесь: https://stackoverflow.com/questions/792 ... a-listview
Мобильная версия