1 场景
2 预备知识
3 解决办法
4 windws和linux下路径
1 场景
在项目中大多会涉及到相对路径和绝对路径,以项目中的配置文件为例,如何找到配置文件的路径?下面介绍几种方法说明。
2 预备知识
(1)System.getProperty("user.dir") 得到的是java虚拟机调用目录即当前用户目录。
如果在eclipse使用该方法,因为Eclipse中启动jvm都是在项目根路径上启动的,如项目所在路径是E:\ProcessFileProcessFile,那么上述方法得到的路径是E:\ProcessFileProcessFile。
如果在tomcat中运行web应用,那么输出的将是tomcat下的bin目录,如E:\tomcat-5.0.28\bin
如果你的可运行jar包的目录是E:\,你启动java包,那么System.getProperty("user.dir")所指的目录是E:\
(2)JAVA IO操作中相对路径都是基于(1)中的这个路径的。
3 方法
(1)方法一以最终java工程打成jar包为例。因为运行java包System.getProperty("user.dir")得到的目录是jar所在的目录,所以配置文件一般放在与jar包同级目录。
在eclipse中java工程如下(配置文件夹config和源码src处于同一级目录)
在代码中使用相对路径找到配置文件,可以看出相对路径是相对于当前用户目录的
打成jar包以后,jar包需要和上述config文件夹放在同级目录下,程序才能找到,如下图
运行jar包得到配置文件中的信息
缺点:System.getProperty("user.dir")获取的路径在not-web aplication 和 web application中时不一样的,不够灵活。
(2)方法2
因为System.getProperty("user.dir")或相对路径在tomcat中运行输出的是tomcat下的bin目录,如E:\tomcat-5.0.28\bin,而我们的wb工程一般是放在webapps下的,如E:\tomcat-5.0.28\webapps,那么配置文件具体位置可以根据System.getProperty("user.dir")的路径找到。但是有一种更简便的方法,不需要你发布工程后另外拷贝配置文件,只需在eclipse开发中放好,然后直接发布到tomcat即可。
getResource("/").getPath()方法直接得到classes所在路径的url(在not-web aplication 和 web application中都能得到程序的class所在根目录),如\E:\tomcat-5.0.28\webapps\项目名称\WEB-INF\classes\
如
String resourcePath=HandleFile.class.getResource("/").getPath();
注意:getResource方法使用了utf-8对路径信息进行了编码,当路径中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要的真实路径,在此,调用了URLDecoder的decode方法进行解码,以便得到原始的中文及空格路径。
classPath = java.net.URLDecoder.decode(classPath, "utf-8");
然后处理该路径即得到classes所在路径,因为我们在项目中src下面的东东是直接编译到classes文件夹下面的,所以配置文件放在src下就会自动编译到classes文件夹下,故发布到tomcat上时无需重新配置。例如下面
推荐使用方法2
4 windows和linux下路径
直接看代码
/** *将路径转换成windows和linux下通用的路径格式 *windows下路径是E:\sample *linux下路径是/sample * @param strPath 要转换的路径 * @return */ public static String commonPath(String strPath) { String resultPath=null; //windows 下 if("\\".equals(File.separator)) { resultPath=strPath.replace("/", "\\"); } //linux 下 if("/".equals(File.separator)) { resultPath=strPath.replace("\\", "/"); } return resultPath; }
5 完整代码
/** * 获取项目类所在根路径,如D:\java\apache-tomcat-7.0.28\webapps\RegistServiceSystem\WEB-INF\classes\ * @return */ public static String getClassesPath() { String classPath = ConfigReader.class.getResource("/").getPath().substring(1); try { // getResource方法使用了utf-8对路径信息进行了编码,当路径中存在中文和空格时,他会对这些字符进行转换,这样,得到的往往不是我们想要的真实路径, // 在此,调用了URLDecoder的decode方法进行解码,以便得到原始的中文及空格路径。 classPath = java.net.URLDecoder.decode(classPath, "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // windows 下 if ("\\".equals(FS)) classPath = classPath.replace("/", "\\"); // linux 下 if ("/".equals(FS)) classPath = classPath.replace("\\", "/"); return classPath; }