JAVA - 绝对路径&相对路径

时间:2022-11-27 18:22:57

Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过是API在底层帮助我们构建了绝对路径,从而找到资源的。

基本概念 

绝对路径从根目录为参考点的文件或文件夹(即目录)所在的路径,只存在一个,具有唯一性

* 本地系统的绝对路径

C:\xyz\test.txt 代表了test.txt文件的绝对路径

* URI形式的绝对资源路径

如,

file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b代表了一个URI绝对路径 

http://www.sun.com/index.htm也代表了一个URL绝对路径 

* 绝对路径的缺点 在网页编程时,很少会使用绝对路径,如果使用“E:\book\网页布\代码\第2章\bg.jpg”来指定背景图片的位置,在自己的计算机上浏览可能会一切正常,但是上传到Web服务器上浏览就很有可能不会显示图片了。因为上传到Web服务器上时,可能整个网站并没有放在Web服务器的E盘, 有可能是D盘或H盘。即使放在Web服务器的E盘里,Web服务器的E盘里也不一定会存在“E:\book\网页布局\代码\第2章”这个目录,因此在浏览网页时是不会显示图片的。

* 获得当前classpath的绝对URI路径的方法

    ClassName.class.getResource(“/”);

        得到的是当前的classpath的绝对URI路径,这种方法“/”代表的是bin根目录

        如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

    Thread.currentThread().getContextClassLoader().getResource(“”);

        得到的也是当前classpath的绝对URI路径,这种方法“”代表的是bin根目录

        如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

    ClassName.class.getClassLoader().getResource(“”);

        得到的也是当前ClassPath的绝对URI路径。

        如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

    ClassLoader.getSystemResource(“”)

        得到的也是当前ClassPath的绝对URI路径。

        如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

* 获得某个类的绝对URI路径的方法

    ClassName.class.getResource(“”);

        得到的是当前类ClassName.class文件所在包的URI目录

        如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/ 

相对路径相对于某个基准目录所推出目的文件或目录所在的路径,没有唯一性

* 在相对路径中,”. /” 代表当前目录,../”代表上级目录

* 相对于classpath的相对路径

如对于test项目,file:/D:/java/eclipse32/workspace/test/bin/这个路径是本项目的classpath,所有的Java源文件编译后的.class文件复制到这个目录中,则相对路径是相对于file:/D:/java/eclipse32/workspace/test/bin/这个路径的路径。

推荐使用相对于当前classpath的相对路径

ClassLoader类的getResource(String path),getResourceAsStream(String path)等方法,使用相对于当前项目的classpath的相对路径来查找资源,读取属性文件常用到的ResourceBundle类的getBundle(String path)也是如此。

* 相对于当前用户目录的相对路径,即相对于System.getProperty(“user.dir”)返回路径的路径

对于一般项目,System.getProperty(“user.dir”)返回的路径是项目的根路径

对于Java EE服务器,System.getProperty(“user.dir”)返回的路径可能是服务器的某个路径,这个并没有统一的规范。所以,绝对不要使用“相对于当前用户目录的相对路径”。

注:默认情况下,java.io包中的类总是根据当前用户目录来分析相对路径名,此目录由系统属性user.dir指定,通常是Java虚拟机的调用目录。这就是说,在使用java.io包中的类时,最好不要使用相对路径。否则,虽然在J2SE应用程序中可能还算正常,但是到了J2EE程序中,一定会出问题!而且这个路径,在不同的服务器中都是不同的!

 

** 对于一般的JAVA文件,相对路径指的是相对JVM的启动路径

举个例子:假设有一JAVA源文件Example.java在D盘根目录下。我们进入命令行窗口,进入到D盘根目录下,然后用“javac Example.java”来编译此文件,编译无错后,会在D盘根目录下自动生成”Example.class”文件。我们再调用”java Example”来运行该程。此时我们已经启动了一个JVM,这个JVM是在D盘根目录下被启动的,所以此JVM所加载的程序中File类的相对路径也就是相对这个路径的,即D盘根目录D:\

** JAVA IDE开发的项目中,相对路径指的是项目的根文件夹的路径。创建文件的写法是:File f = new File("src/com/lavasoft/res/a.txt");

由于实际项目在打包后没有src目录,脱离了IDE环境,这个写法就是错误的

** 对于JAVA WEB

” /”开头的路径是相对WEB根目录的相对路径,不以” /”开头的路径的是相对当前路径的相对路径

绝对路径:

通过ServletContext.getRealPath(“/”)方法得到Web应用程序的根目录的绝对路径(JAVA SE不可用),这种方法以webroot为根目录,需从classes目录中读取文件

如:getServletContext().getRealPath("/WEB-INF/classes/test.txt");

通过ClassLoader类的getResource(String 相对路径)方法获得当前classpath的绝对路径后拼资源的相对路径获得绝对路径

如:getClass().getClassLoader().getResource(“.”).toString();