在Java中列出文件的最佳方法,按date修改?

我想获得一个目录中的文件列表,但我想sorting,使最旧的文件是第一个。 我的解决scheme是调用File.listFiles,只是基于File.lastModified的列表,但我想知道是否有更好的方法。

编辑:我build议当前的解决scheme是使用匿名比较器:

File[] files = directory.listFiles(); Arrays.sort(files, new Comparator<File>(){ public int compare(File f1, File f2) { return Long.valueOf(f1.lastModified()).compareTo(f2.lastModified()); } }); 

我认为你的解决scheme是唯一明智的方法。 获取文件列表的唯一方法是使用File.listFiles() ,文档指出这不能保证返回的文件的顺序。 因此,您需要编写一个使用File.lastModified()的Comparator ,并将其与文件数组一起传递给Arrays.sort() 。

如果你有很多文件,这可能会更快。 这使用装饰sortingundecorate模式,以便每个文件的最后修改的date只获取一次,而不是每次sortingalgorithm比较两个文件。 这可能会将I / O调用的数量从O(n log n)减less到O(n)。

但是,这是更多的代码,所以只有在你主要关心速度的时候才能使用它,而在实践中速度要快得多(我没有检查过)。

 class Pair implements Comparable { public long t; public File f; public Pair(File file) { f = file; t = file.lastModified(); } public int compareTo(Object o) { long u = ((Pair) o).t; return t < u ? -1 : t == u ? 0 : 1; } }; // Obtain the array of (file, timestamp) pairs. File[] files = directory.listFiles(); Pair[] pairs = new Pair[files.length]; for (int i = 0; i < files.length; i++) pairs[i] = new Pair(files[i]); // Sort them by timestamp. Arrays.sort(pairs); // Take the sorted pairs and extract only the file part, discarding the timestamp. for (int i = 0; i < files.length; i++) files[i] = pairs[i].f; 

什么是类似的方法,但没有拳击龙的对象:

 File[] files = directory.listFiles(); Arrays.sort(files, new Comparator<File>() { public int compare(File f1, File f2) { return Long.compare(f1.lastModified(), f2.lastModified()); } }); 

你也可以看看Apache的公共IO ,它有一个内置的最后修改比较和许多其他很好的工具来处理文件。

在Java 8中:

Arrays.sort(files, (a, b) -> Long.compare(a.lastModified(), b.lastModified()));

import:

 org.apache.commons.io.comparator.LastModifiedFileComparator 

Apache Commons

代码:

 public static void main(String[] args) throws IOException { File directory = new File("."); // get just files, not directories File[] files = directory.listFiles((FileFilter) FileFileFilter.FILE); System.out.println("Default order"); displayFiles(files); Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR); System.out.println("\nLast Modified Ascending Order (LASTMODIFIED_COMPARATOR)"); displayFiles(files); Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE); System.out.println("\nLast Modified Descending Order (LASTMODIFIED_REVERSE)"); displayFiles(files); } 

如果正在执行sorting的文件正在被修改/更新,将会违反比较合同的传递性要求。 为了避免这个潜在的错误,你需要build立一个最后修改值的静态查找表,以便在每个文件的比较器中使用,如下所示:

  Collection<File> files = ... final Map<File, Long> staticLastModifiedTimes = new HashMap<File,Long>(); for(final File f : files) { staticLastModifiedTimes.put(f, f.lastModified()); } Collections.sort(files, new Comparator<File>() { @Override public int compare(final File f1, final File f2) { return staticLastModifiedTimes.get(f1).compareTo(staticLastModifiedTimes.get(f2)); } }); 

使用Java 8的优雅解决scheme:

在Java 8中,可以使用Comparator类中的静态方法Comparator

 File[] files = directory.listFiles(); Arrays.sort(files, Comparator.comparingLong(File::lastModified)); 

或者,如果你想要降序,只需将其反转:

 File[] files = directory.listFiles(); Arrays.sort(files, Comparator.comparingLong(File::lastModified).reversed()); 
 public String[] getDirectoryList(String path) { String[] dirListing = null; File dir = new File(path); dirListing = dir.list(); Arrays.sort(dirListing, 0, dirListing.length); return dirListing; } 

你可以尝试番石榴订购 :

 Function<File, Long> getLastModified = new Function<File, Long>() { public Long apply(File file) { return file.lastModified(); } }; List<File> orderedFiles = Ordering.natural().onResultOf(getLastModified). sortedCopy(files); 

你可以使用Apache LastModifiedFileComparator库

  import org.apache.commons.io.comparator.LastModifiedFileComparator; File[] files = directory.listFiles(); Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR); for (File file : files) { Date lastMod = new Date(file.lastModified()); System.out.println("File: " + file.getName() + ", Date: " + lastMod + ""); } 
 private static List<File> sortByLastModified(String dirPath) { List<File> files = listFilesRec(dirPath); Collections.sort(files, new Comparator<File>() { public int compare(File o1, File o2) { return Long.compare(o1.lastModified(), o2.lastModified()); } }); return files; } 

我来到这个职位,当我正在寻找同样的问题,但在android 。 我不认为这是按最后修改date获取sorting文件的最好方法,但是它是我find的最简单的方法。

下面的代码可能有助于某人 –

 File downloadDir = new File("mypath"); File[] list = downloadDir.listFiles(); for (int i = list.length-1; i >=0 ; i--) { //use list.getName to get the name of the file } 

谢谢