У меня есть код, как показано ниже:
class ListPageXMLFiles implements FileFilter {
@Override
public boolean accept(File pathname) {
DebugLog.i("ListPageXMLFiles", "pathname is " + pathname);
String regex = ".*page_\\d{2}\\.xml";
if(pathname.getAbsolutePath().matches(regex)) {
return true;
}
return false;
}
}
public void loadPageTrees(String xml_dir_path) {
ListPageXMLFiles filter_xml_files = new ListPageXMLFiles();
File XMLDirectory = new File(xml_dir_path);
for(File _xml_file : XMLDirectory.listFiles(filter_xml_files)) {
loadPageTree(_xml_file);
}
}
Он FileFilter
работает нормально, но, listFiles()
похоже, перечисляет файлы в обратном алфавитном порядке. Есть ли какой-нибудь быстрый способ listFile()
указать файлы в алфавитном порядке?
.endsWith(".xml")
вместо него.Ответы:
listFiles
Метод, с фильтром или без него не гарантирует порядок.Однако он возвращает массив, по которому можно выполнять сортировку
Arrays.sort()
.File[] files = XMLDirectory.listFiles(filter_xml_files); Arrays.sort(files); for(File _xml_file : files) { ... }
Это работает, потому что
File
это сопоставимый класс, который по умолчанию сортирует пути лексикографически. Если вы хотите отсортировать их по-другому, вы можете определить свой собственный компаратор.Если вы предпочитаете использовать потоки:
Более современный подход заключается в следующем. Чтобы распечатать имена всех файлов в данном каталоге в алфавитном порядке, выполните:
Замените на
System.out::println
все, что вы хотите сделать с именами файлов. Если вам нужны только имена файлов, которые заканчиваются"xml"
просто do:Files.list(Paths.get(dirName)) .filter(s -> s.toString().endsWith(".xml")) .sorted() .forEach(System.out::println)
Опять же, замените печать любой желаемой операцией обработки.
источник
sort
.Я думаю, что предыдущий ответ - лучший способ сделать это, вот еще один простой способ. просто чтобы распечатать отсортированные результаты.
String path="/tmp"; String[] dirListing = null; File dir = new File(path); dirListing = dir.list(); Arrays.sort(dirListing); System.out.println(Arrays.deepToString(dirListing));
источник
В Java 8:
Обратный порядок:
источник
Arrays.sort(fList, Comparator.comparing(File::getName));
Это мой код:
try { String folderPath = "../" + filePath.trim() + "/"; logger.info("Path: " + folderPath); File folder = new File(folderPath); File[] listOfFiles = folder.listFiles(); int length = listOfFiles.length; logger.info("So luong files: " + length); ArrayList<CdrFileBO> lstFile = new ArrayList< CdrFileBO>(); if (listOfFiles != null && length > 0) { int count = 0; for (int i = 0; i < length; i++) { if (listOfFiles[i].isFile()) { lstFile.add(new CdrFileBO(listOfFiles[i])); } } Collections.sort(lstFile); for (CdrFileBO bo : lstFile) { //String newName = START_NAME + "_" + getSeq(SEQ_START) + "_" + DateSTR + ".s"; String newName = START_NAME + DateSTR + getSeq(SEQ_START) + ".DAT"; SEQ_START = SEQ_START + 1; bo.getFile().renameTo(new File(folderPath + newName)); logger.info("newName: " + newName); logger.info("Next file: " + getSeq(SEQ_START)); } } } catch (Exception ex) { logger.error(ex); ex.printStackTrace(); }
источник