Java相对路径寻址 - 编程入门网
e("")
得到的也是当前ClassPath的绝对URI路径。 如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/ 推荐使用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法。 Web应用程序中资源的寻址 上文中说过,当前用户目录,即相对于System.getProperty("user.dir")返回的路径。 对于JavaEE服务器,这可能是服务器的某个路径,这个并没有统一的规范! 而不是我们发布的Web应用程序的根目录! 这样,在Web应用程序中,我们绝对不能使用相对于当前用户目录的相对路径。 在Web应用程序中,我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。 这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。 这是我们开发Web应用程序时一般所采取的策略。 Java相对路径寻址(3)时间:2011-01-29 沈东良通用的相对路径解决办法 Java中各种相对路径非常多,不容易使用,非常容易出错。因此,我编写了一个便利方法,帮助更容易的解决相对路径问题。 Web应用程序中使用JavaSE运行的资源寻址问题 在JavaSE程序中,我们一般使用classpath来作为存放资源的目的地。但是,在Web应用程序中,我们一般使用classpath外面的WEB-INF及其子目录作为资源文件的存放地。 在Web应用程序中,我们一般通过ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。这样,我们只需要提供相对于Web应用程序根目录的路径,就可以构建出定位资源的绝对路径。 Web应用程序,可以作为Web应用程序进行发布和运行。但是,我们也常常会以JavaSE的方式来运行Web应用程序的某个类的main方法。或者,使用JUnit测试。这都需要使用JavaSE的方式来运行。 这样,我们就无法使用ServletContext.getRealPath("/")方法得到Web应用程序的根目录的绝对路径。 而JDK提供的ClassLoader类, 它的getResource(String name),getResourceAsStream(String name)等方法,使用相对于当前项目的classpath的相对路径来查找资源。 读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。 它们都只能使用相对路径来读取classpath下的资源,无法定位到classpath外面的资源。 Classpath外配置文件读取问题 如,我们使用测试驱动开发的方法,开发Spring、Hibernate、iBatis等使用配置文件的Web应用程序,就会遇到问题。 尽管Spring自己提供了FileSystem(也就是相对于user,dir目录)来读取Web配置文件的方法,但是终究不是很方便。而且与Web程序中的代码使用方式不一致! 至于Hibernate,iBatis就更麻烦了!只有把配置文件移到classpath下,否则根本不可能使用测试驱动开发! 怎么办? 通用的相对路径解决办法 面对这个问题,我决定编写一个助手类ClassLoaderUtil,提供一个便利方法[public static URL getExtendResource(String relativePath)]。在Web应用程序等一切Java程序中,需要定位classpath外的资源时,都使用这个助手类的便利方法,而不使用Web应用程序特有的ServletContext.getRealPath("/")方法来定位资源。 利用classpath的绝对路径,定位所有资源 这个便利方法的实现原理,就是“利用classpath的绝对路径,定位所有资源”。 ClassLoader类的getResource("")方法能够得到当前classpath的绝对路径,这是所有Java程序都拥有的能力,具有最大的适应性! 而目前的JDK提供的ClassLoader类的getResource(String 相对路径)方法,只能接受一般的相对路径。这样,使用ClassLoader类的getResource(String 相对路径)方法就 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |