如何按字母顺序 File.listFiles?
Posted
技术标签:
【中文标题】如何按字母顺序 File.listFiles?【英文标题】:how to File.listFiles in alphabetical order? 【发布时间】:2011-11-04 05:19:14 【问题描述】:我的代码如下:
class ListPageXMLFiles implements FileFilter
@Override
public boolean accept(File pathname)
DebugLog.i("ListPageXMLFiles", "pathname is " + pathname);
String regex = ".*page_\\d2\\.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")
。
【参考方案1】:
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)
再次,用您想要的任何处理操作替换打印。
【讨论】:
这是一行漂亮的代码,但 Arrays.sort() 似乎返回 void,而不是 Iterable。我会四处逛逛。 @雷兔,对不起!!很抱歉,你是对的。我应该测试过它。我编辑了我的答案。 它在 Windows 中似乎工作正常,但在 Ubuntu 中,大写字母的文件夹比其他文件夹先出现。 这就是我期望它工作的方式。在 Unicode 中,大写字母位于小写字母之前。 Unix 有区分大小写的文件名,所以大写字母在前。如果您在 Windows 上使用不区分大小写的文件名,则大写和小写名称将混合在一起。这完全符合预期。如果您想在 Unix 上使用 Windows 方式,请为sort
提供一个比较器。【参考方案2】:
我认为以前的答案是最好的方法,这里是另一种简单的方法。只是为了打印排序结果。
String path="/tmp";
String[] dirListing = null;
File dir = new File(path);
dirListing = dir.list();
Arrays.sort(dirListing);
System.out.println(Arrays.deepToString(dirListing));
【讨论】:
您能否提供评论,说明您认为这不是正确答案的原因。所以,我可以相应地修改它。 -1 我真的不明白将文件数组转换为字符串数组然后排序而不是像接受的答案那样仅仅对文件数组进行排序的好处。 @zelanix 感谢您提供反馈。我没有所有的答案,有时我在回答问题时会犯错误。我已经更新了答案,请您查看一下,看看这是否是一个更好的解决方案。如果您能重新考虑您的投票,我将不胜感激。提前致谢。 好的,现在你证明为什么如果你只想打印结果会更简单,所以我会删除我的反对意见。 @CPU100 我相信通过使用 list() 而不是 listFiles() 具有只有文件名而没有父目录路径的优势,从而导致更短的字符串和更少的 cpu 时间来排序/比较。【参考方案3】:这是我的代码:
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();
【讨论】:
【参考方案4】:在 Java 8 中:
Arrays.sort(files, (a, b) -> a.getName().compareTo(b.getName()));
倒序:
Arrays.sort(files, (a, b) -> -a.getName().compareTo(b.getName()));
【讨论】:
你也可以使用这个代码:Arrays.sort(fList, Comparator.comparing(File::getName));
小心这个。此代码是不确定的,不应按原样使用。
为什么不,谁的代码?以上是关于如何按字母顺序 File.listFiles?的主要内容,如果未能解决你的问题,请参考以下文章
我如何使用 file.listFiles() 来列出子目录和文件