获取最后一个修改的文件,其名称与Java 8匹配

获取最后一个修改的文件,其名称与Java 8匹配,java,file,java-8,Java,File,Java 8,我正在尝试使用匹配模式检索上次修改的文件名,该模式以Order_u开头,不应该有任何隐藏文件,但它会引发编译错误 try { File dir = new File("< dir >"); if (!dir.isDirectory()) { Optional<File> op = Arrays.stream(dir.listFiles(File::isFile)) .max((f1, f2

我正在尝试使用匹配模式检索上次修改的文件名,该模式以Order_u开头,不应该有任何隐藏文件,但它会引发编译错误

try {
    File dir = new File("< dir >");
    if (!dir.isDirectory()) {
        Optional<File> op = Arrays.stream(dir.listFiles(File::isFile))
                .max((f1, f2) -> Long.compare(f1.lastModified(), f12lastModified()))
                .filter(fl -> fl.getName().startsWith("Order_") && !fl.getCanonicalPath().endsWith("~"))
        ; // Unhandled exception compilation error for canonicalPath method 
    }
} catch (Exception e) {
}

任何想法都将不胜感激。

这感觉像是对lambda的辱骂(用锤子给烤面包涂黄油,而不是黄油刀,因为你刚买了它,它又亮又新)

.max()
可选的形式返回1或0个元素。您然后筛选该可选项以检查命名是否正确

换句话说,如果最近修改的文件恰好不是以
顺序
开头的,那么这将返回Optional.NONE,这肯定不是您的意图。您想翻转
max
filter

更一般地说,您不希望对lambdas执行此操作。内联lambda是较小的邪恶-它们不是异常透明的、不可变的局部变量透明的,也不是控制流透明的

当lambda表示将在其他上下文(例如,另一个线程或更高版本)中运行的代码时,这3个属性非常棒当代码运行时,它们是缺点

这意味着,当内联代码概念的基于lambda的策略和基于非lambda的策略大致相同时,您应该更喜欢基于非lambda的策略。这在这里变得特别尖锐,因为代码使用的是过时的API(旧的
java.io.File
API,而不是新的
java.nio.File
API)

在这种情况下,
.getCanonicalPath()
的行为有点奇怪:调用
fl.getName().endsWith(…)
fl.getCanonicalPath().endsWith(…)
之间唯一的功能区别是,如果引用的“文件”是软链接,后者将首先跟随链接

这听起来像是软链接很重要,如果它们很重要,你就不会想要这个API,因为它在软链接面前是不可靠的,而且定义不清的。新的API处理得更好,您可能希望使用它(例如,
java.nio.file.Files
walk
方法)。如果软链接不重要,那么很容易:将
.getCanonicalPath()
替换为
.getName()
,一切正常。好的,在您修复bug并将
过滤器
max
行翻转回正确的位置后


还要注意,
.getCanonicalPath()
速度很慢-它需要命中磁盘,或者至少可能会命中磁盘。(如果它是一个软链接,则会发生;API没有定义在其他情况下是否会发生。JVM impl可以在某些操作系统上自由点击磁盘,而在其他操作系统上则不会。它可能在您的系统上运行得非常快,而在另一个系统上运行得非常慢,这使得测试非常困难)。

请在您的问题中包含错误。还有
字符无效
字符串
文字,应替换为
这是否回答了您的问题@Lino,引号是作为打字的一部分添加的。它们是表中的有效引号editor@Abra,是的,这是一个编译错误。谢谢。在同一目录中有一些损坏或隐藏的文件,所以我不想考虑文件。我尝试用max翻转过滤器,但编译错误仍然存在。
Exception: Unhandled exception: java.io.IOException