写一个SSLsocket 的类,需要设置证书,如下:
System.setProperty("javax.net.ssl.trustStore","C:\Tomcat 5.5\webapps\expstudent\cacerts.store");为增加移植性,我想使用相对路径 "/../../cacerts.store",可是这样写程序就找不到证书文件了。这个类是放在C:\Tomcat 5.5\webapps\expstudent\WEB-INF\classes 下面的,经测试类文件中根目录 "/" 是指
C:\Tomcat 5.5\webapps\expstudent\WEB-INF\classes
所以我想使用 "/../../cacerts.store",可是为什么不行呢?另外相同文件夹下的另一个类中,我使用了相同的方法是可以找到文件的:
InputStream is = this.getClass().getResourceAsStream("/../../upload/"+myFilename);
上面这行是对的,为什么换一个类换一个函数就不行了呢?难道是因为System.setProperty()不支持相对路径?请问有什么通用方法解决路径移植性问题么?
System.setProperty("javax.net.ssl.trustStore","C:\Tomcat 5.5\webapps\expstudent\cacerts.store");为增加移植性,我想使用相对路径 "/../../cacerts.store",可是这样写程序就找不到证书文件了。这个类是放在C:\Tomcat 5.5\webapps\expstudent\WEB-INF\classes 下面的,经测试类文件中根目录 "/" 是指
C:\Tomcat 5.5\webapps\expstudent\WEB-INF\classes
所以我想使用 "/../../cacerts.store",可是为什么不行呢?另外相同文件夹下的另一个类中,我使用了相同的方法是可以找到文件的:
InputStream is = this.getClass().getResourceAsStream("/../../upload/"+myFilename);
上面这行是对的,为什么换一个类换一个函数就不行了呢?难道是因为System.setProperty()不支持相对路径?请问有什么通用方法解决路径移植性问题么?
可是对不同服务器这个方法好像得到的路径最后一个字符会有带"/"不带"/"的区别。
以前用这个方法,经常是换个操作系统或者换个服务器就不对了
都说“一次编写,到处运行”,我咋是“运行一次,编写一次”
我现在的想法是文件名前面都加上"/", 既"/filename"
然后得到全路径,把所有"//","\/"都替换成"/", 不过这样会不会太笨了呢
在拼出你的文件路径
不同的系统下File.separator 会有不同的表现形式.
new File(".").getAbsolutePath()
System.getProperty("user.dir")
为什么不同函数中"/"的位置就不同了呢?不是有种说法 “服务器端解析的路径其根都是web application的目录”么,怎么不一样呢
那不又回到拼绝对路径的老路么。
不过目前看来由于不同函数中"/" ".." 的意义都会不同,似乎还是拼绝对路径更简单了
甚至不用关心 / 和 \ 的差异。请参考下面的程序,在运行的时候需要增加命令行参数 -Dexpstudent.home="C:\Tomcat 5.5\webapps\expstudent"
String refRoot = System.getProperty("expstudent.home");
System.out.println(refRoot);
String abspath = new File(new File(refRoot), "certs/cacerts.store").getCanonicalPath();
System.out.println(abspath);
可以得到类似String refRoot = System.getProperty("expstudent.home");的路径请问如何能无视\/的困扰呢?
绝对路径拼接主要的困扰在2个地方,
1. windows是\ linux 是/ ,当然File.separator可以自动获取,但我更喜欢都用"/".
2.getRealPath("")获得路径有时候最后带个分割符,有时候不带,(似乎取决于服务器,tomcat和weblogic就不同)
拼接时就会产生如"C:\Tomcat 5.5\webapps\expstudent\/cacerts.store" 这种情况,
我想的办法是所有绝对路径都用String的replace 方法把\/ // 替换成/
土办法啊,我实在没别的办法了。
我说的方法需要在系统部署的时候做一点额外的工作,这算是增加“可移植性”的代价吧。如果你用我程序中给出的方法来拼接出绝对路径,的确是不用关心分隔符的问题,你试试就知道了,最后总能得到一个正确的绝对路径字符串。
多谢!你解决了困扰我很久的问题。