告别获取不安全的相对路径-取当前类的Classpath

这是一个古老的话题了,我曾经写过一篇文章讨论这个话题

http://blog.csdn.net/sunyujia/archive/2008/01/05/2027087.aspx 

取得相对路径的方法有很多,但是安全的方法并不多,我什么这么说呢?

我先说下一些流行方法的不安全性

转载请注明出处http://blog.csdn.net/sunyujia/

1.new File(./xx.txt);或者是new File(xx.txt);

这种方法实际上是和window操作系统有关系的,对批处理和Win32编程有研究的朋友知道,运行一个程序要让操作系统知道两点,1是文件存放的所在位置,2是文件的起始位置,这个起始位置很重要的,文件可以放置在C:/,而起始位置可以是D:/

感兴趣的朋友可以试试新建立一个批处理test.bat

  1. dir 
  2. pause

放置在c盘运行它,可以列出c盘的目录

然后在这个批处理文件上面创建一个快捷方程式,然后右键->属性->修改它的起始位置为d盘

点击这个快捷方程式再看结果,如何?列出的是d盘的目录.

所以在java中使用new File(xx.txt);是非常不安全的,因为.这个路径的到底在哪里,取决于调用java 命令的起始位置定义在哪里.

tomcat/bin 下面的catalina.bat调用了java所以在tomcat环境下"."的位置就是tomcat/bin,但是eclipse启动程序,起始位置就是eclipse的项目路径下了.不多说,大家已经可以看出来了,这不是一个好方法.因为不能通过程序所在位置来确定一个路径.

当然并不是说这种方法就不可取,熟悉命令的朋友会想到在启动java.exe的时候将%CD%传进jvm里面,这是个方法,但是未免太麻烦了些.

2.类.class.getClassLoader().getResource("");

这也算是个比较流行的方法,但是使用它获取相对路径很不明朗,因为大部分情况我们希望相对路径针对我们的class来说是固定的,如果使用此方法,这把决定权交给了类加载器,例如tomcat的类加载是非委托机制的,而weblogic的类加载是委托机制的,仅凭此一点就决定了,使用此方法不能保证在任何环境下,相对路径是真正相对于class文件的.它是不安全的,不过大部分情况下它是安全的.我也在相当长的一段时间内认为他是安全的,后来在weblogic的一个复杂类加载器环境中发现它的不安全性.

3.类.class.getResource("")

看上去这确实是个好方法,但是它的局限性在于如果类在jar中的话,那么在打jar包的时候需要将文件夹也一起打进去,否则会返回null,jar文件实际上就是zip文件,zip文件中:文件是文件,文件夹是文件夹,不是关联在一起的,很多开源的jar包就没有把目录打进去只打了classes文件,虽然你能够看到文件的目录层次结构,但是调用类.class.getResource("")会返回null的.因为文件的目录结构和文件夹本身是两回事.对于这个问题可追溯到我以前的一篇帖子http://topic.csdn.net/u/20080520/21/1dc25316-8316-46f8-904b-ded9c4b7587a.html

至于在web应用中取相对路径的方法我就不说了,因为他有局限性,我这里说的都是在任何环境下都可以使用的方法.

取相对路径最安全的的方法是什

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值