如何使用Java 7的新文件API检查路径是否指向现有文件?

36

旧的、已经过时的java.io.File API有一个exists方法,如果File指向文件系统中的现有文件,则返回true,但我找不到与之相对应的方法适用于java.nio.file.Path

scala> import java.nio.file._
import java.nio.file._

scala> val path = Paths.get("/foo")
path: java.nio.file.Path = /foo

scala> path.
asInstanceOf     compareTo        endsWith         getFileName      getFileSystem    getName          getNameCount     
getParent        getRoot          isAbsolute       isInstanceOf     iterator         normalize        register         
relativize       resolve          resolveSibling   startsWith       subpath          toAbsolutePath   toFile           
toRealPath       toString         toUri  

当然,我可以把 path 转换回 File,但我认为有更好的方法来做到这一点。

编辑:好的,感谢所有指出 Files.exists 的人。有人知道为什么它变得更加复杂了吗(比拥有一个简单的 exists 方法在 Path 上)?

4个回答

60

使用Files类:

Files.exists(path);

编辑:回答您的后续问题,我认为该方法在另一个类中的原因是Path是一个接口,并且他们想提供一种实现(类似于将排序方法放在Collections类中而不是List接口中)。

与问题无直接关系,但根据ratchet freak的说法,该方法还有一个可选的变长参数,用于确定如何处理符号链接。

在此处阅读Oracle的Javadocs


所以基本上它确保了在Files中只有一个实现(由Oracle提供)的方法,而不是可能存在多个不同的实现,如果它被定义在Path中的话? - soc
是的,我想这就是原因。只有一个实现,而且它独立于“Path”实现。 - OpenSauce
我猜只需要几周时间,Scala的开发者们就会把这些方法重新放回更方便的位置了 :-) - soc
1
如果您不想接受目录,请使用Files.isRegularFile(path) - Vojta
新的NIO也可以处理zip文件内部的路径。在这种情况下,您会收到一个不支持的操作异常。 - Andrew S

9

请查看实用类Files,该包与it技术有关:

Files.exists(Path path,LinkOption... options)

2

在新的文件系统API中,所有文件操作都由Files类定义。大多数这些操作是基于其他操作实现的,或者它们委托给适当的文件系统提供程序。另一方面,路径操作是在Path接口中定义的。路径只是用于定位文件的对象。如果您想对文件执行操作,则调用适当的Files方法,指定要定位文件的路径。


0
不需要为此添加新的方法:使用Path.toFile()获取文件,然后运行exists

2
这不就是我说的吗,提到必须有更好的方法? :-) - soc
啊,所以你反对必须逐步执行它。那么,你可以尝试使用 toRealPath(),我相信如果文件不存在,它会抛出一个 IOException? - Femi

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