Java的AbsolutePath与RealPath的区别

虽然是给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

博客:http://blog.youkuaiyun.com/liuwenzhe2008

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值