基于JAVA⽂件中获取路径及WEB应⽤程序获取路径的⽅
法
1. 基本概念的理解
`绝对路径`:你应⽤上的⽂件或⽬录在硬盘上真正的路径,如:URL、物理路径
例如:
c:/代表了⽂件的绝对路径;
`相对路径`:相对与某个基准⽬录的路径,包含Web的相对路径(HTML中的相对⽬录)。
例如:
在Servlet中,"/"代表Web应⽤的根⽬录,和物理路径的相对表⽰。
例如:
"./"代表当前⽬录,"../"代表上级⽬录。这种类似的表⽰,也是属于相对路径。
2. 关于JSP/Servlet中的相对路径和绝对路径。
2.1 服务器端的地址
其⽤到的地⽅有:
`forward:servlet中的RequestDispatcher(address);`这个address是在服务器端解析的,所以,你要forward到a.jsp 应该这么写:
2.2 客户端的地址
Javascript也是在客户端解析的,所以其相对路径和form表单⼀样。
因此,⼀般情况下,在JSP/HTML页⾯等引⽤的CSS,Javascript,Action等属性前⾯最好都加上webapp应⽤名称,以确保所引⽤的⽂件都属于Web应⽤中的⽬录。eclipse怎么打开已有的java文件
另外,应该尽量避免使⽤类似".","./","../../"等类似的相对该⽂件位置的相对路径,这样当⽂件移动时,很容易出问题。
3. JSP/Servlet中获得当前应⽤的相对路径和绝对路径
3.1 JSP中获得当前应⽤的相对路径和绝对路径
根⽬录所对应的绝对路径:`RequestURI();`
⽂件的绝对路径:`RequestURI());`
当前web应⽤的绝对路径:`RealPath("/");`
取得请求⽂件的上层⽬录:`RequestURI())).getParent();`
3.2 Servlet中获得当前应⽤的相对路径和绝对路径
根⽬录所对应的绝对路径:`ServletPath();`
⽂件的绝对路径:`Session().getServletContext().getRealPath();`
当前web应⽤的绝对路径:`ServletContext().getRealPath("/");`
ServletContext对象获得⼏种⽅式:
javax.servlet.ServletContext()
javax.servlet.ServletContext()
javax.ServletContext()
4. java的Class中获得相对路径,绝对路径的⽅法
4.1 单独的Java类中获得绝对路径
根据java.io.File的Doc⽂挡,可知:`默认情况下newFile("/")代表的⽬录为:Property("user.dir");`。
以下程序获得执⾏类的当前路径:
package org.cheng.file;
import java.io.File;
public class FileTest{
public static void main(String[]args)throws Exception{
System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));
System.out.println(ClassLoader().getResource(""));
System.out.SystemResource(""));
System.out.println(Resource(""));
System.out.println(Resource("/"));//Class⽂件所在路径
System.out.println(newFile("/").getAbsolutePath());
System.out.Property("user.dir"));
}
}
4.2 服务器中的Java类获得当前路径(来⾃⽹络)
(1).Weblogic
WebApplication的系统⽂件根⽬录是你的weblogic安装所在根⽬录。
例如:如果你的weblogic安装在
那么,你的⽂件根路径就是c:.
所以,有两种⽅式能够让你访问你的服务器端的⽂件:
a.使⽤绝对路径:
⽐如将你的参数⽂件放在c:yourconfig/yourconf.properties,
直接使⽤newFileInputStream("yourconfig/yourconf.properties");
b.使⽤相对路径:
相对路径的根⽬录就是你的webapplication的根路径,即WEB-INF的上⼀级⽬录,将你的参数⽂件放在yourwebapp/yourconfig/yourconf.properties,
这样使⽤:
newFileInputStream("./yourconfig/yourconf.properties");
这两种⽅式均可,⾃⼰选择。
(2).Tomcat
在类中输出Property("user.dir");显⽰的是%Tomcat_Home%/bin
(4).如何读相对路径哪?
在Java⽂件中getResource或getResourceAsStream均可
例:`getClass().getResourceAsStream(filePath);` // filePath可以是"/filename",这⾥的/代表web发布根路径下WEB-INF/classes
默认使⽤该⽅法的路径是:WEB-INF/classes。已经在Tomcat中测试。
5.读取⽂件时的相对路径,避免硬编码和绝对路径的使⽤。
5.1采⽤Spring的DI机制获得⽂件,避免硬编码。
Java中使⽤的路径,分为两种:绝对路径和相对路径。具体⽽⾔,⼜分为四种:
(1)URI形式的绝对资源路径
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b
URL是URI的特例。URL的前缀/协议,必须是Java认识的。URL可以打开资源,⽽URI则不⾏。
URL和URI对象可以互相转换,使⽤各⾃的toURI(),toURL()⽅法即可!
(2)本地系统的绝对路径
D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b
Java.io包中的类,需要使⽤这种形式的参数。但是,它们⼀般也提供了URI类型的参数,⽽URI类型的参数,接受的是URI样式的String。因此,通过URI转换,还是可以把URI样式的绝对路径⽤在java.io包中的类中。
(3)相对于classpath的相对路径
如:相对于 file:/D:/java/eclipse32/workspace/jbpmtest3/bin/这个路径的相对路径。其中,bin是本项⽬的classpath。所有的Java源⽂件编译后的.class⽂件复制到这个⽬录中。
(4)相对于当前⽤户⽬录的相对路径
就是相对于Property("user.dir")返回的路径。
对于⼀般项⽬,这是项⽬的根路径。对于JavaEE服务器,这可能是服务器的某个路径。这个并没有统⼀的规范!
所以,绝对不要使⽤“相对于当前⽤户⽬录的相对路径”。
然⽽:默认情况下,java.io 包中的类总是根据当前⽤户⽬录来分析相对路径名。此⽬录由系统属性 user.dir 指定,通常是Java 虚拟机的调⽤⽬录。
这就是说,在使⽤java.io包中的类时,最好不要使⽤相对路径。否则,虽然在J2SE应⽤程序中可能还算正常,但是到了J2EE 程序中,⼀定会出问题!⽽且这个路径,在不同的服务器中都是不同的!
`相对路径最佳实践`:推荐使⽤相对于当前classpath的相对路径,因此,我们在使⽤相对路径时,应当使⽤相对于当前classpath的相对路径。
`ClassLoader类的getResource(String name),getResourceAsStream(String name)等⽅法`,使⽤相对于当前项⽬的classpath 的相对路径来查资源。
读取属性⽂件常⽤到的`ResourceBundle类的getBundle(String path)`也是如此。
通过查看ClassLoader类及其相关类的源代码,它实际上还是使⽤了URI形式的绝对路径。通过得到当
前classpath 的URI形式的绝对路径,构建了相对路径的URI形式的绝对路径。(这个实际上是猜想,因为JDK内部调⽤了SUN的源代码,⽽这些代码不属于JDK,不是开源的。)
`相对路径本质上还是绝对路径`,因此,归根结底,Java本质上只能使⽤绝对路径来寻资源。所有的相对路径寻资源的⽅法,都不过是⼀些便利⽅法。不过是API在底层帮助我们构建了绝对路径,从⽽到资源的!
下⾯是⼀些得到classpath和当前类的绝对路径的⼀些⽅法。你可能需要使⽤其中的⼀些⽅法来得到你需要的资源的绝对路径。
1. `Resource("")`:得到的是当前类FileTest.class⽂件的URI⽬录。不包括⾃⼰!
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/
2. `Resource("/")`:得到的是当前的classpath的绝对URI路径。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
3. `Thread.currentThread().getContextClassLoader().getResource("")`:得到的也是当前ClassPath的绝对URI路径。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
4. `ClassLoader().getResource("")`:得到的也是当前ClassPath的绝对URI路径。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
5. `SystemResource("")`:得到的也是当前ClassPath的绝对URI路径。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/
`推荐使⽤`:Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表⽰法。
Web应⽤程序中资源的寻址
上⽂中说过,当前⽤户⽬录,即相对于Property("user.dir")返回的路径。对于JavaEE服务器,这可能是服务器的某个路径,这个并没有统⼀的规范!⽽不是我们发布的Web应⽤程序的根⽬录!这样,在Web应⽤程序中,我们绝对不能使⽤相对于当前⽤户⽬录的相对路径。
在Web应⽤程序中,我们⼀般通过`RealPath("/")`⽅法得到Web应⽤程序的根⽬录
的绝对路径。这样,我们只需要提供相对于Web应⽤程序根⽬录的路径,就可以构建出定位资源的绝对路径。
这是我们开发Web应⽤程序时⼀般所采取的策略。
通⽤的相对路径解决办法
Java中各种相对路径⾮常多,不容易使⽤,⾮常容易出错。因此,编写了⼀个便利⽅法,帮助更容易的解决相对路径问题。Web应⽤程序中使⽤JavaSE运⾏的资源寻址问题
在JavaSE程序中,我们⼀般使⽤classpath来作为存放资源的⽬的地。但是,在Web应⽤程序中,我们⼀般使⽤classpath外⾯的WEB-INF及其⼦⽬录作为资源⽂件的存放地。
在Web应⽤程序中,我们⼀般通过RealPath("/")⽅法得到Web应⽤程序的根⽬录的绝对路径。这样,我们只需要提供相对于Web应⽤程序根⽬录的路径,就可以构建出定位资源的绝对路径。
Web应⽤程序,可以作为Web应⽤程序进⾏发布和运⾏。但是,我们也常常会以JavaSE的⽅式来运⾏Web应⽤程序的某个类的main⽅法。或者,使⽤JUnit测试。这都需要使⽤JavaSE的⽅式来运⾏。
这样,我们就⽆法使⽤RealPath("/")⽅法得到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应⽤程序特有的RealPath("/")⽅法来定位资源。
利⽤classpath的绝对路径,定位所有资源
这个便利⽅法的实现原理,就是“利⽤classpath的绝对路径,定位所有资源”。
ClassLoader类的getResource("")⽅法能够得到当前classpath的绝对路径,这是所有Java程序都拥有的能⼒,具有最⼤的适应性!
⽽⽬前的JDK提供的ClassLoader类的getResource(String 相对路径)⽅法,只能接受⼀般的相对路径。这样,使⽤ClassLoader类的getResource(String 相对路径)⽅法就只能定位到classpath下的资源。
如果,它能够接受“../”这样的参数,允许我们⽤相对路径来定位classpath外⾯的资源,那么我们就可以定位位置的资源!
当然,我⽆法修改ClassLoader类的这个⽅法,于是,我编写了⼀个助⼿类ClassLoaderUtil类,提供了
[public static URL getExtendResource(String relativePath)]这个⽅法。它能够接受带有“../”符号的相对路径,实现了⾃由寻资源的功能。
以上这篇基于JAVA⽂件中获取路径及WEB应⽤程序获取路径的⽅法就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参
考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论