如何检查Java 7路径的扩展


83

我想检查Path(在Java 7中引入)是否以某个扩展名结尾。我尝试这样的endsWith()方法:

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

但是,这似乎不起作用,因为path.endsWith(".java")返回false。似乎endsWith()只有在最终目录分隔符(例如bar.java)之后的所有内容都完全匹配时,该方法才返回true ,这对我来说并不实用。

那么如何检查路径的文件扩展名?



1
@assylias,这个问题是从而String不是从中找到扩展名Path(尽管它可以与一起使用Path.toString(),但是我希望找到一种不需要的扩展名)。
Thunderforge 2013年

文件扩展名的概念取决于操作系统,因此我认为文件或路径中不支持它。
assylias 2013年

@assylias:好,那太糟了。文件扩展名的概念定义明确,在Windows / Linux / MacOs / Android中使用了很多次。尽管它们在Linux中的重要性可能不如Windows中重要,但它们仍在台式机和服务器应用程序中使用很多。
埃里克·杜米尼尔

Answers:


82

Java NIO的PathMatcher提供FileSystem.getPathMatcher(String语法AndPattern)

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");

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

有关详细信息,请参见“查找文件”教程。


13
我认为这缺少星号,以下对我PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");
乔什(Josh)2015年

21
而且,如果要浏览其他目录,则需要使用“ glob:**。java”
LaGrandMere 2015年

1
对我来说,LaGrandMere的评论起到了作用。如果@Dave Jarvis可以将他的建议合并到选举的答案中,我想这将对NIO-API的初学者有所帮助。在Windoze下:如果我确实想使用glob:*.java,则filename不应包含任何父路径。如果我使用类似的rel / abs路径glob:c:/users/muchwow/*.java,则它可以正常工作(请注意\\\\必须与反斜杠一起使用)。该模式glob:**.java仅搜索其中带有* .java的所有内容,而与父路径无关。
JackLeEmmerdeur

67

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

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

15

简单的解决方案:

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

3

无法直接在Path对象本身上执行此操作。

我可以看到两个选项:

  1. 将路径转换为文件并在File.getName()返回的字符串上调用endsWith
  2. 在Path上调用toString,并在该String上调用endsWith。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.