我的代码如下:
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()
按字母顺序列出文件?
答案 0 :(得分:204)
使用或不使用过滤器的listFiles
方法不保证任何订单。
Arrays.sort()
进行排序。
File[] files = XMLDirectory.listFiles(filter_xml_files);
Arrays.sort(files);
for(File _xml_file : files) {
...
}
这是有效的,因为File
是一个类似的类,默认情况下按字典顺序对路径名进行排序。如果要对它们进行不同的排序,可以定义自己的比较器。
如果您更喜欢使用Streams:
更现代的方法如下。要按字母顺序打印给定目录中所有文件的名称,请执行以下操作:
Files.list(Paths.get(dirName)).sorted().forEach(System.out::println)
将System.out::println
替换为您要对文件名执行的操作。如果您只想要以"xml"
结尾的文件名,请执行以下操作:
Files.list(Paths.get(dirName))
.filter(s -> s.toString().endsWith(".xml"))
.sorted()
.forEach(System.out::println)
再次,用您想要的任何处理操作替换打印。
答案 1 :(得分:1)
我认为前面的答案是最好的方法,这是另一种简单的方法。只是打印排序结果。
String path="/tmp";
String[] dirListing = null;
File dir = new File(path);
dirListing = dir.list();
Arrays.sort(dirListing);
System.out.println(Arrays.deepToString(dirListing));
答案 2 :(得分:1)
在Java 8中:
Arrays.sort(files, (a, b) -> a.getName().compareTo(b.getName()));
倒序:
Arrays.sort(files, (a, b) -> -a.getName().compareTo(b.getName()));
答案 3 :(得分:0)
这是我的代码:
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();
}