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

Thu*_*rge 66 java path java-7

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

Path path = Paths.get("foo/bar.java")
if (path.endsWith(".java")){
    //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

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

fan*_*fan 71

Java NIO的PathMatcher提供了FileSystem.getPathMatcher(String syntaxAndPattern):

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

Path filename = ...;
if (matcher.matches(filename)) {
    System.out.println(filename);
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅" 查找文件"教程

  • 如果您正在浏览不同的目录,则需要使用"glob:**.java" (18认同)
  • 我认为这是一个星号,下面的内容适用于我:`PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:*.java");` (13认同)
  • 对我来说,拉格朗米尔的评论起了作用。如果 @Dave Jarvis 可以将他的建议合并到选定的答案中,我想这将有助于 NIO-API 的初学者。在 Windoze 下:如果我确实想使用 `glob:*.java`,那么 `filename` 不应包含任何父路径。如果我使用像 `glob:c:/users/muchwow/*.java` 这样的 rel/abs 路径,它就可以工作(注意 \\\\ 必须与反斜杠一起使用)。模式 `glob:**.java` 只搜索其中包含 *.java 的所有内容,无论父路径如何。 (2认同)

Mis*_*ble 61

Path班没有"延伸"的概念,可能是因为文件系统本身不拥有它.这就是为什么你需要检查它的String表示,看它是否以四个 五个字符串结束.java.请注意,endsWith如果要覆盖混合大小写,则需要不同于简单的比较,例如:".JAVA"".Java":

path.toString().toLowerCase().endsWith(".java");
Run Code Online (Sandbox Code Playgroud)


Per*_*122 13

简单方案:

if( path.toString().endsWith(".java") ) //Do something
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)