虽然是给Java类做实验,但我们不需要创建Java文件和编译,太麻烦,可以方便的用scala的命令行解析器做实验,有代码提示和补全功能,非常方便。
导入java.nio.file.*:
scala> import java.nio.file._
import java.nio.file._
Paths.get只是对字符串进行Path封装
scala> val path = Paths.get("..")
path: java.nio.file.Path = ..
在scala命令行解析器里按tab键,可以看到提示,或者补全,向Linux Shell那样:
scala> path.get
getClass getFileName getFileSystem getName getNameCount getParent getRoot
scala> path.getFile
getFileName getFileSystem
scala> path.getFileName()
res4: java.nio.file.Path = product
AbsolutePath
AbsolutePath会用得起当前工作路径加上相对路径,直接组合在一起
scala> val path1 = Paths.get("..").toAbsolutePath()
path1: java.nio.file.Path = /gpfs/users/weliu/product/dev/LSF/product/gui/..
AbsolutePath仍然只是字符串的组合,不管路径是否是真的路径还是软链接(符号链接),
scala> val path = Paths.get("../bin").toAbsolutePath()
path: java.nio.file.Path = /gpfs/users/weliu/product/dev/LSF/product/gui/../bin
甚至不管路径是否存在,都无所谓。
scala> val path = Paths.get("../binss").toAbsolutePath()
path: java.nio.file.Path = /gpfs/users/weliu/product/dev/LSF/product/gui/../binss
就是这么简单地拼接起来,因此同一路径返回的path对象可能是不一样的,这一点编程时要格外注意。
scala> val path2 = Paths.get("../../product").toAbsolutePath()
path2: java.nio.file.Path = /gpfs/users/weliu/product/dev/LSF/product/gui/../../product
scala> val equal = path1.equals(path2)
equal: Boolean = false
RealPath
RealPath就不一样,它不仅是绝对路径,而且是“真正的”绝对路径,不只是把当前路径加相对路径那么简单。
scala> val path1 = Paths.get("..").toRealPath()
path1: java.nio.file.Path = /gpfs/users/weliu/product/dev/LSF/product
软链接(符号链接)的RealPath就是指向真正的实际路径。
scala> val path = Paths.get("../bin").toRealPath()
path: java.nio.file.Path = /gpfs/software/platform_product_nightly/LSF/product/bin
如果路径不存在,会直接抛出NoSuchFileException异常,
scala> val path = Paths.get("../binss").toRealPath()
java.nio.file.NoSuchFileException: ../binss
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixPath.toRealPath(UnixPath.java:837)
... 32 elided
不管你怎么表达,只要真的是同一路径,RealPath都是一样的。
scala> val path2 = Paths.get("../../product").toRealPath()
path2: java.nio.file.Path = /gpfs/users/weliu/product/dev/LSF/product
scala> val equal = path1.equals(path2)
equal: Boolean = true
——- 本博客所有内容均为原创,转载请注明作者和出处 ——-
作者:刘文哲
联系方式:liuwenzhe2008@qq.com