如何在 Java 的目录中找到最后修改的文件?
Posted
技术标签:
【中文标题】如何在 Java 的目录中找到最后修改的文件?【英文标题】:How do I find the last modified file in a directory in Java? 【发布时间】:2011-01-05 02:25:47 【问题描述】:如何在java的目录中找到最后修改的文件?
【问题讨论】:
你问如何按上次修改时间排序?或者你想要一个找到最大最后修改时间的算法?这些似乎是显而易见的解决方案;你到底想要什么? 【参考方案1】:private File getLatestFilefromDir(String dirPath)
File dir = new File(dirPath);
File[] files = dir.listFiles();
if (files == null || files.length == 0)
return null;
File lastModifiedFile = files[0];
for (int i = 1; i < files.length; i++)
if (lastModifiedFile.lastModified() < files[i].lastModified())
lastModifiedFile = files[i];
return lastModifiedFile;
【讨论】:
我认为使用自定义比较器会更干净,但这种方式更快。 使用比较器是一种很好的做法,但这只是一项简单的任务,可以不用它。 没有。 long 值越大,文件修改越晚。如果这是投反对票的原因,请随时撤消它;) @Bozho - 使用比较器不是“好习惯”,而不是使用int
类型是“好习惯”。您可以说的最强的是,比较器是许多编程问题的良好(部分)解决方案。
如果目录为空,您可能会获得超出范围的索引。您不应该在循环之外将 files[0] 分配给 lastModifiedFile。【参考方案2】:
将这两者结合起来:
-
您可以使用
File.lastModified()
获取文件的最后修改时间。
要列出目录中的所有文件,请使用File.listFiles()
。
请注意,在 Java 中,java.io.File
对象同时用于目录和文件。
【讨论】:
【参考方案3】:import org.apache.commons.io.comparator.LastModifiedFileComparator;
import org.apache.commons.io.filefilter.WildcardFileFilter;
...
...
/* Get the newest file for a specific extension */
public File getTheNewestFile(String filePath, String ext)
File theNewestFile = null;
File dir = new File(filePath);
FileFilter fileFilter = new WildcardFileFilter("*." + ext);
File[] files = dir.listFiles(fileFilter);
if (files.length > 0)
/** The newest file comes first **/
Arrays.sort(files, LastModifiedFileComparator.LASTMODIFIED_REVERSE);
theNewestFile = files[0]
return theNewestFile;
这对我很有用
【讨论】:
【参考方案4】:您可以使用 File.lastModified() 方法检索上次修改的时间。我建议的解决方案是实现一个按 lastModified() 顺序排序的自定义比较器,并将目录中的所有文件插入到使用此比较器排序的 TreeSet 中。
未经测试的示例:
SortedSet<File> modificationOrder = new TreeSet<File>(new Comparator<File>()
public int compare(File a, File b)
return (int) (a.lastModified() - b.lastModified());
);
for (File file : myDir.listFiles())
modificationOrder.add(file);
File last = modificationOrder.last();
如果您只需要最后一个文件,Bozho 建议的解决方案可能会更快。另一方面,如果您需要做一些更复杂的事情,这可能会很有用。
【讨论】:
【参考方案5】:您的问题类似于:How to get only 10 last modified files from directory using Java?
只需将过滤器代码更改为只有一个文件,并且接受方法应该简单地比较两个时间戳。
未经测试的代码:
class TopFileFilter implements FileFilter
File topFile;
public boolean accept(File newF)
if(topFile == null)
topFile = newF;
else if(newF.lastModified()>topFile.lastModified())
topFile = newF;
return false;
现在,使用此过滤器的实例作为参数调用 dir.listFiles。最后,filter.topFile 是最后修改的文件。
【讨论】:
【参考方案6】:假设变量thePath
包含我们要搜索的目录,下面的sn -p返回里面最后修改的文件:
Files.walk(thePath)
.sorted((f1, f2) -> -(int)(f1.toFile().lastModified() - f2.toFile().lastModified()))
.skip(1)
.findFirst()
它的作用是:
首先将文件按最后修改时间倒序排列, 然后跳过目录本身, 最后取流中的第一个元素(这是最后修改的元素)。【讨论】:
虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。【参考方案7】:Emil 解决方案中的比较器这样会更干净
public int compare(File a, File b)
if ((a.lastModified() < b.lastModified()))
return 1;
else if ((a.lastModified() > b.lastModified()))
return -1;
return 0;
将(a.lastModified() - b.lastModified())
转换为int
可能会产生意想不到的结果。
【讨论】:
【参考方案8】: String path = "C:\\Work\\Input\\";
File dir = new File(path);
File[] files = dir.listFiles();
Arrays.sort(files, new Comparator<File>()
public int compare(File f1, File f2)
return Long.valueOf(f2.lastModified()).compareTo(
f1.lastModified());
);
for (int index = 0; index < files.length; index++)
// Print out the name of files in the directory
System.out.println(files[index].getName());
【讨论】:
【参考方案9】:Java 8
Optional<Path> findLastModifiedFile(Path directory) throws IOException
return Files.list(directory)
.max(this::compareLastModified);
int compareLastModified(Path p1, Path p2)
try
return Files.getLastModifiedTime(p1).compareTo(Files.getLastModifiedTime(p2));
catch (IOException e)
throw new RuntimeException(e);
【讨论】:
以上是关于如何在 Java 的目录中找到最后修改的文件?的主要内容,如果未能解决你的问题,请参考以下文章