如何检查Java 7路径的扩展名?

100

我想检查一个以Java 7中引入的Path是否以特定扩展名结尾。我尝试使用endsWith()方法,如下所示:

Path path = Paths.get("foo/bar.java")
if (path.endsWith(".java")){
    //Do stuff
}

然而,这似乎行不通,因为path.endsWith(".java")返回false。看来endsWith()方法只有在最后一个目录分隔符后的所有内容完全匹配(例如bar.java)时才返回true,这对我来说不实用。

那么我该如何检查Path的文件扩展名呢?


https://dev59.com/E3A65IYBdhLWcg3w5zHB - assylias
1
@assylias,这个问题是查找String的扩展名,而不是Path的(尽管可以使用Path.toString(),但我希望有一种不需要它的方法)。 - Thunderforge
文件扩展名的概念取决于操作系统,因此我认为File或Path中没有对其提供支持。 - assylias
@assylias:这太糟糕了。文件扩展名的概念在Windows/Linux/MacOs/Android中已经被明确定义并使用了很多次。即使它们在Linux中可能比在Windows中不那么重要,但它们仍然在桌面和服务器应用程序中被广泛使用。 - Eric Duminil
4个回答

98
Java NIO的PathMatcher提供了FileSystem.getPathMatcher(String syntaxAndPattern)
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");

Path filename = ...;
if (matcher.matches(filename.getFileName())) {
    System.out.println(filename);
}

当你的路径包含多个组件时,需要使用.getFileName()
有关详细信息,请参阅查找文件教程。

15
我认为这里缺少一个星号,以下代码可以解决:PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java"); - Josh
28
如果你正在查看不同的目录,你需要使用“glob:**.java”。 - LaGrandMere
1
对我来说,LaGrandMere的评论解决了问题。如果@Dave Jarvis能将他的建议合并到被选答案中,我想这会帮助NIO-API的初学者。在Windoze下:如果我确实想使用glob:*.java,那么filename就不应该包含任何父路径。如果我使用类似于glob:c:/users/muchwow/*.java的相对/绝对路径,它可以工作(请注意必须使用反斜杠)。模式glob:**.java只是搜索所有带有*.java的内容,而不考虑父路径。 - JackLeEmmerdeur
与其将PathMatcher应用到这个问题上,不如只检查文件名(字符串)是否以后缀结尾,这是一种更加简单的方法。 - Max Spring
https://dev59.com/2Ybca4cB1Zd3GeqPXY-E#36954357 - The Prototype

79

Path类没有“扩展名”的概念,可能是因为文件系统本身没有该概念。这就是为什么您需要检查其String表示形式,并查看它是否以五个字符字符串.java结尾。请注意,如果要覆盖混合大小写,例如".JAVA"".Java",则需要进行不同的比较,而不是简单的endsWith

path.toString().toLowerCase().endsWith(".java");

这不是一个好的解决方案,因为可能会出现NullPointer。最好使用一些库(例如apache IO utils)或如上所述的PathMatcher。 - KHanusova

24

简单解决方案:

if( path.toString().endsWith(".java") ) //Do something

使用Path.endsWith方法时必须小心。正如您所述,该方法仅在与Path对象的子元素匹配时返回true

例如:

Path p = Paths.get("C:/Users/Public/Mycode/HelloWorld.java");
System.out.println(p.endsWith(".java")); // false
System.out.println(p.endsWith("HelloWorld.java")); // true

4

直接在Path对象本身上没有完成此操作的方法。

我看到有两个选项:

  1. 将Path转换为File,并在返回的字符串上调用File.getName()以使用endsWith方法。
  2. 在Path上调用toString方法,然后在返回的字符串上使用endsWith方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接