总结一下java获取路径几种途径
- 格式:doc
- 大小:85.00 KB
- 文档页数:10
Java获取项⽬路径的多种⽅式在正常开发的情况下,我们经常会遇到:需要获取指定⽂件路径,虽然我知道项⽬在本机的路径,⼀旦打包发布了,再根据绝对路径获取指定⽂件,肯定是获取不到的。
这时候就需要⽤java给我们提供的⼀些获取相对路径⽅法了。
@Testpublic void url() throws IOException {// 获取当前项⽬下路径:⽅式⼀File file = new File("");String filePath = file.getCanonicalPath();// 输出:D:\MyCode\log\log4j2-javaSystem.out.println(filePath);// 获取当前项⽬下路径:⽅式⼆// 输出:D:\MyCode\log\log4j2-javaSystem.out.println(System.getProperty("user.dir"));// 获取类加载的根路径String path = this.getClass().getResource("/").getPath().substring(1);// 输出:D:/MyCode/log/log4j2-java/target/classes/System.out.println(path);// 获取当前类的所在⼯程路径String path1 = this.getClass().getResource("").getPath().substring(1);// 输出:D:/MyCode/log/log4j2-java/target/classes/com/gzl/cn/System.out.println(path1);// 获取类加载指定⽂件或者⽂件夹路径String path2 = this.getClass().getResource("/data/DataConvert.dll").getPath().substring(1);System.out.println(path2);//获取所有的类路径包括jar包的路径System.out.println(System.getProperty("java.class.path"));}这个是我的项⽬路径。
java通过反射获取路径的方法(一)Java通过反射获取路径介绍在Java中,反射是一种强大的机制,它允许我们在运行时获取类的信息并动态地调用类的方法。
通过反射,我们还可以获取类的路径。
本文将详细介绍多种方法,用于在Java中通过反射获取路径。
方法一:使用Class对象通过Class对象可以获取类的加载路径。
1.先获取Class对象,例如:Class<?> clazz = ;2.然后使用ClassLoader类的getResource()方法获取资源路径,例如:URL resource = ().getResource("");String path = ();方法二:使用Class类的getResource()方法Class类提供了getResource()方法用于获取资源路径。
1.先获取类的相对路径,例如:String relativePath = "myFolder/";2.然后使用getResource()方法获取资源路径,例如:URL resource = (relativePath);String path = ();方法三:使用ClassLoader类的getSystemResource()方法ClassLoader类的getSystemResource()方法可以获取系统资源路径。
1.先获取类的相对路径,例如:String relativePath = "myFolder/";2.然后使用getSystemResource()方法获取资源路径,例如:URL resource = (relativePath);String path = ();方法四:使用File类通过File类可以获取文件路径。
1.先获取类的相对路径,例如:String relativePath = "myFolder/";2.然后使用File类获取文件路径,例如:File file = new File(relativePath);String path = ();方法五:使用System类System类提供了getProperty()方法用于获取系统属性。
Java获取项目的相对路径一、什么是项目的相对路径在Java中,获取项目的相对路径是指获取Java项目在文件系统中的相对于某个参照物的路径。
这个参照物可以是Java项目的根目录、当前工作目录或者其他指定的路径。
二、获取项目的相对路径的方法Java提供了多种方法来获取项目的相对路径,下面将介绍其中几种常用的方法。
1. 使用Class类的getResource方法Class类是Java中表示对象类的类,它提供了获取类的资源的方法。
可以通过Class类的getResource方法来获取指定资源的URL。
代码如下:URL resourceUrl = MyClass.class.getResource("/resource.txt");String resourcePath = resourceUrl.getPath();上述代码中,MyClass为当前类的类名,/resource.txt为要获取的资源路径。
getResource方法返回的URL对象可以通过getPath方法获取路径的字符串形式,即为相对路径。
2. 使用ClassLoader类的getResource方法ClassLoader类是Java中用于加载类和资源的类加载器的基类,它提供了获取资源的方法。
可以通过ClassLoader类的getResource方法来获取指定资源的URL。
代码如下:ClassLoader classLoader = MyClass.class.getClassLoader();URL resourceUrl = classLoader.getResource("resource.txt");String resourcePath = resourceUrl.getPath();上述代码中,MyClass为当前类的类名,resource.txt为要获取的资源路径。
getResource方法返回的URL对象可以通过getPath方法获取路径的字符串形式,即为相对路径。
关于java和web工程项目中各种路径的获取总结参考网络文章整理1. 获取web服务器项目的真实物理路径Java代码2. 相对路径的获得说明:相对路径(即不写明时候到底相对谁)均可通过以下方式获得(不论是一般的java项目还是web项目)Java代码上述相对路径中,java项目中的文件是相对于项目的根目录web项目中的文件路径视不同的web服务器不同而不同(tomcat是相对于tomcat安装目录\bin)3. 类加载目录的获得(即当运行时某一类时获得其装载目录)3.1. 通用的方法一(不论是一般的java项目还是web项目,先定位到能看到包路径的第一级目录)Java代码录位于src目录下)上式中将TestAction,test.txt替换成对应成相应的类名和文件名字即可3.2. 通用方法二(此方法和1.1中的方法类似,不同的是此方法必须以'/'开头)InputStream is=Test1.class.getResourceAsStream("/test.txt");(test.txt文件的路径为项目名\src\test.txt,类Test1所在包的第一级目录位于src目录下)4. web项目根目录的获得(发布之后)4.1. 从servlet出发可建立一个servlet在其的init方法中写入如下语句Java代码(结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\ (002_ext为项目名字) 如果是调用了s1.getRealPath("")则输出D:\工具\Tomcat-6.0\webapps\002_ext(少了一个"\")4.2. 从httpServletRequest出发Java代码结果形如:D:\工具\Tomcat-6.0\webapps\002_ext\5. classpath的获取(在Eclipse中为获得src或者classes目录的路径)5.1. 方法一Java代码输出:t---/E:/order/002_ext/WebRoot/WEB-INF/classes/5.2. 方法二Java代码输出:JdomParse.class.getClassLoader().getResource--/E:/order/002_ext/WebRoot/ WEB-INF/classes/另外,如果想把文件放在某一包中,则可以通过以下方式获得到文件(先定位到该包的最后一级目录)egJava代码输出:JdomParse.class.getResource---/E:/order/002_ext/WebRoot/WEB-INF/classe s/jdom/(JdomParse为src目录下jdom包中的类)在jsp和class文件中调用的相对路径不同。
java获取文件完整路径的方法-回复Java是一种广泛使用的编程语言,它提供了丰富的类库和方法来处理文件和目录。
在Java中获取文件的完整路径是一项非常常见的任务,因为它可以帮助我们更好地理解文件的位置和结构。
本文将一步一步回答关于如何在Java中获取文件的完整路径的问题。
第一步:指定文件的相对路径在Java中,文件可以使用相对路径或绝对路径来指定。
相对路径是相对于当前工作目录或项目目录的路径,而绝对路径是从文件系统的根目录开始的路径。
在本例中,我们假设文件位于项目目录下的一个名为"files"的文件夹中。
第二步:创建一个File对象要获取文件的完整路径,我们首先要创建一个File对象。
File类是Java 中处理文件和目录的基本类,可以用于获取文件的路径、名称、大小等信息。
我们可以使用以下代码创建一个File对象:javaFile file = new File("files/example.txt");在这个例子中,我们创建了一个名为example.txt的文件。
请注意,虽然我们只提供了相对路径,但Java会自动将其解释为相对于项目目录的路径。
第三步:获取文件的完整路径一旦我们创建了一个File对象,就可以使用它的`getAbsolutePath()`方法来获取文件的完整路径。
代码如下所示:javaString absolutePath = file.getAbsolutePath();`getAbsolutePath()`方法返回一个String类型的值,表示文件的完整路径。
它将包括文件的所在目录以及文件的名称和扩展名。
在本例中,它将返回`/path/to/project/files/example.txt`。
第四步:处理特殊情况在有些情况下,当我们获取文件的完整路径时,可能会遇到一些特殊的情况。
下面是一些常见的特殊情况及其解决方法:1. 文件不存在:如果指定的文件不存在,`getAbsolutePath()`方法将返回文件的路径,但不包括文件的名称。
java 获取当前项目指定资源路径的命令在Java开发过程中,需要获取当前项目指定资源路径的命令是非常常见的操作。
这个操作可以帮助我们在代码中获取项目的资源文件,比如配置文件、图片等,以便进行相关的读取或操作。
下面将详细介绍如何使用Java获取当前项目指定资源路径的命令。
1. 使用getClassLoader()方法获取资源路径Java提供了一个ClassLoader类,这个类可以帮助我们获取Java虚拟机中加载的所有类以及资源信息。
我们可以通过这个类的getResource()或者getResourceAsStream()方法来获取资源路径。
下面是一个使用ClassLoader的示例:```public class MainClass {public static void main(String[] args) {// 获取当前类的ClassLoaderClassLoader classLoader =MainClass.class.getClassLoader();// 获取资源路径URL resourceUrl =classLoader.getResource("config.properties");String resourcePath = resourceUrl.getPath();// 输出资源路径System.out.println(resourcePath);}}```在上面的代码中,我们首先使用MainClass类的类加载器获取配置文件config.properties的路径。
为了获取资源路径,我们可以调用ClassLoader类的getResource()方法。
这个方法的参数是需要获取的资源的相对路径,相对路径是相对于类加载路径的。
2. 使用Class类中的getResource()方法获取资源路径除了使用ClassLoader获取资源路径,还可以使用Class类中的getResource()方法。
Java中获取当前路径1. 获取当前路径(绝对路径)package p01;import java.io.File;import java.io.IOException;import .URL;public class Hello01 {public static void main(String[] args) {System.out.println(getCurrentPath1());// D:\eclipseJavaWorkspace\eclipse202006Workspace\Hello\binSystem.out.println(new Hello01().getCurrentPath2());// D:\eclipseJavaWorkspace\eclipse202006Workspace\Hello\bin\p01System.out.println(getCurrentPath3());// D:\eclipseJavaWorkspace\eclipse202006Workspace\HelloSystem.out.println(getCurrentPath4());// file:/D:/eclipseJavaWorkspace/eclipse202006Workspace/Hello/bin/System.out.println(getCurrentPath5());// D:\eclipseJavaWorkspace\eclipse202006Workspace\Hello\binSystem.out.println(getCurrentPath6());// D:\eclipseJavaWorkspace\eclipse202006Workspace\HelloSystem.out.println(getCurrentPath7());// /D:/eclipseJavaWorkspace/eclipse202006Workspace/Hello/bin//* 结果:D:\eclipseJavaWorkspace\eclipse202006Workspace\Hello\binD:\eclipseJavaWorkspace\eclipse202006Workspace\Hello\bin\p01D:\eclipseJavaWorkspace\eclipse202006Workspace\Hellofile:/D:/eclipseJavaWorkspace/eclipse202006Workspace/Hello/bin/D:\eclipseJavaWorkspace\eclipse202006Workspace\Hello\binD:\eclipseJavaWorkspace\eclipse202006Workspace\HelloD:\eclipseJavaWorkspace\eclipse202006Workspace\Hello\bin*/}// 获取当前类的所在⼯程路径;public static String getCurrentPath1() {File f = new File(Hello01.class.getResource("/").getPath());return f.getPath();}// 获取当前类的绝对路径;public String getCurrentPath2() {File f = new File(this.getClass().getResource("").getPath());return f.getPath();}// 获取当前类的所在⼯程路径;public static String getCurrentPath3() {File directory = new File("");// 参数为空// getCanonicalPath()返回的就是标准的将符号完全解析的路径String courseFile = "";try {courseFile = directory.getCanonicalPath();} catch (IOException e) {e.printStackTrace();}return courseFile;}// 获取当前类的所在⼯程路径;// file:/D:/eclipseJavaWorkspace/eclipse202006Workspace/Hello/bin/public static String getCurrentPath4() {URL path = Thread.currentThread().getContextClassLoader().getResource("");return path.toString();}public static String getCurrentPath5() {return System.getProperty("java.class.path");}public static String getCurrentPath6() {return System.getProperty("user.dir");}public static String getCurrentPath7() {String path = Thread.currentThread().getContextClassLoader().getResource("").getPath();// /D:/eclipseJavaWorkspace/eclipse202006Workspace/Hello/bin/ String p = new File(path).getAbsolutePath();// D:\eclipseJavaWorkspace\eclipse202006Workspace\Hello\binreturn p;}}View Code2. 获取资源⽂件的路径,或读⽂件获取src下资源⽂件编译后的路径(即classes路径):String s2 = Thread.currentThread().getContextClassLoader().getResource("").getPath(); // /D:/eclipseJavaWorkspace/eclipse202006Workspace/Hello/bin///String s3 = Thread.currentThread().getContextClassLoader().getResource("/").getPath();// java⼯程下报错:NullPointerExceptionString s4 = Thread.currentThread().getContextClassLoader().getResource("test.txt").getPath();// /D:/eclipseJavaWorkspace/eclipse202006Workspace/Hello/bin/test.txt 或者类名.class.getClassLoader().getResource("").getPath();或者 this.class.getClassLoader().getResource("").getPath();//此⽅法获得的path,虽然前⾯多⼀个“/”,但仍然可以⽤于构造FileFile file2 = new File(s2);File file4 = new File(s4);InputStream in = new BufferedInputStream(new FileInputStream(new File(s2)));//还可以使⽤如下,直接返回输⼊流对象InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("test.txt");//test.txt在src夹下(即classpath下)if(null == resourceAsStream) {throw new RuntimeException("nullPointer...");}else {StringBuilder sb = new StringBuilder();byte[] buf = new byte[512];int len = -1;try {while((len = resourceAsStream.read(buf))!=-1) {sb.append(new String(buf,0,len));}System.out.println(sb.toString());} catch (IOException e) {e.printStackTrace();}}3. Java中的getResourceAsStream有以下⼏种:1. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以'/'开头则是从ClassPath根下获取。
Java获取项⽬中的路径Java获取项⽬中的路径博客分类:JavaEE在项⽬中经常需要获取某个⽂件的路径:在这⾥提供⼀些获取路径的⽅法..1.此种⽅式获取的路径,是当前类所在的路径:Java代码1. UserDAOTest.class.getResource("UserDAOTest.class")结果如下:file:/E:/java/workspace/testProject/WebContent/WEB-INF/classes/com/java/business/dao/UserDAOTest.class2.此种⽅式获取当前classpath的路径:Java代码1. Thread.currentThread().getContextClassLoader().getResource("")结果如下:file:/E:/java/workspace/testProject/WebContent/WEB-INF/classes/3.此种⽅式获取系统资源⽂件的路径.如果为空,则是获取classpath所在的路径。
Java代码1. ClassLoader.getSystemResource("")结果如下:file:/E:/java/workspace/testProject/WebContent/WEB-INF/classes/4.此种⽅式获取UserDAOTest class⽂件的路径。
Java代码1. UserDAOTest.class.getResource("")结果如下:file:/E:/java/workspace/testProject/WebContent/WEB-INF/classes/com/business/dao/5.此种⽅式,获取项⽬所在的磁盘。
Java代码1. new File("/").getAbsolutePath()结果如下:E:\6.此种⽅式,获取项⽬名称的绝对路径。
Java获取当前路径的方法1. 介绍在Java编程中,有时候我们需要获取当前程序所在的路径,以便进行文件操作或者加载资源等操作。
本文将介绍几种获取当前路径的方法,以及它们的优缺点和适用场景。
2. System.getProperty方法使用System.getProperty方法可以获取当前程序的一些系统属性,其中包括用户的工作目录。
通过”user.dir”属性可以获取当前程序所在的路径。
String currentPath = System.getProperty("user.dir");System.out.println("当前路径:" + currentPath);这种方法简单直接,适用于大多数情况下获取当前路径的需求。
但需要注意的是,System.getProperty方法返回的路径可能因操作系统而异,因此在跨平台开发时需要注意兼容性。
3. ClassLoader.getResource方法通过Java中的ClassLoader类的getResource方法,我们可以获取当前类加载的根路径,从而间接获取当前程序所在的路径。
例如,通过下面的代码可以获取当前类所在的路径:String currentPath = getClass().getClassLoader().getResource("").getPath(); System.out.println("当前路径:" + currentPath);这种方法适用于获取类路径下的资源文件的路径,常用于读取配置文件等操作。
但需要注意的是,如果当前类是在jar包中运行的,那么该方法将返回null,因为jar包中的类没有对应的文件路径。
4. File类的相对路径Java的File类提供了一种简单的方法来获取当前程序所在的路径,即通过创建一个临时文件并获取其父路径。
通过下面的代码可以实现:File currentFile = new File("");String currentPath = currentFile.getAbsoluteFile().getParent();System.out.println("当前路径:" + currentPath);这种方法无需引入额外的依赖,适用于获取当前程序所在的路径。
java获取相对路径文件的方法在Java编程中,我们经常需要获取文件的路径。
有时候我们需要获取相对路径文件,即相对于当前工作目录的文件路径。
本文将介绍如何在Java中获取相对路径文件的方法。
在Java中,可以使用File类来表示文件和目录的路径。
File类提供了一系列方法来获取文件的路径信息。
对于相对路径文件,我们可以使用以下方法来获取其路径:1. 使用相对路径字符串创建File对象我们可以使用相对路径字符串来创建一个File对象。
相对路径是相对于当前工作目录的路径。
可以使用System.getProperty("user.dir")方法来获取当前工作目录的路径。
```javaString relativePath = "data/file.txt";File file = new File(System.getProperty("user.dir"), relativePath);```在上面的代码中,我们创建了一个名为file.txt的相对路径文件。
其中,`System.getProperty("user.dir")`返回当前工作目录的路径。
然后,我们将相对路径字符串和当前工作目录的路径传递给File构造函数来创建File对象。
2. 使用相对路径字符串获取文件路径如果只需要获取相对路径文件的路径字符串,而不需要创建File对象,我们可以使用Paths类来获取路径。
Paths类提供了一个静态方法`Paths.get()`来获取路径对象。
```javaString relativePath = "data/file.txt";String path = Paths.get(System.getProperty("user.dir"), relativePath).toString();```在上面的代码中,我们使用`Paths.get()`方法来获取相对路径文件的路径对象,然后使用`toString()`方法将路径对象转换为字符串。
总结一下java获取路径几种途径- -在写java程序时不可避免要获取文件的路径...总结一下,遗漏的随时补上1.可以在servlet的init方法里String path = getServletContext().getRealPath("/");这将获取web项目的全路径例如 :E:\eclipseM9\workspace\tree\tree是我web项目的根目录2.你也可以随时在任意的class里调用this.getClass().getClassLoader().getResource("/").getPath();这将获取到classes目录的全路径例如 : E:\eclipseM9/workspace/tree/WEB-INF/classes/这个方法也可以不在web环境里确定路径,比较好用3.request.getContextPath();获得web根的上下文环境如 /treetree是我的web项目的root context获取web项目的全路径Java路径问题最终解决方案—可定位所有资源的相对路径寻址前言Java的路径问题,非常难搞。
最近的工作涉及到创建和读取文件的工作,这里我就给大家彻底得解决Java路径问题。
我编写了一个方法,比ClassLoader.getResource(String 相对路径)方法的能力更强。
它可以接受“.. /”这样的参数,允许我们用相对路径来定位classpath外面的资源。
这样,我们就可以使用相对于classpat h的路径,定位所有位置的资源!Java路径Java中使用的路径,分为两种:绝对路径和相对路径。
具体而言,又分为四种:一、URI形式的绝对资源路径如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.bURL是URI的特例。
URL的前缀/协议,必须是Java认识的。
URL可以打开资源,而URI则不行。
URL和URI对象可以互相转换,使用各自的toURI(),toURL()方法即可!二、本地系统的绝对路径D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.bJava.io包中的类,需要使用这种形式的参数。
但是,它们一般也提供了URI类型的参数,而URI类型的参数,接受的是URI样式的String。
因此,通过URI转换,还是可以把URI样式的绝对路径用在java.io包中的类中。
三、相对于classpath的相对路径如:相对于file:/D:/java/eclipse32/workspace/jbpmtest3/bin/这个路径的相对路径。
其中,bin是本项目的classpath。
所有的Java源文件编译后的.class文件复制到这个目录中。
四、相对于当前用户目录的相对路径就是相对于System.getProperty("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和当前类的绝对路径的一些方法下面是一些得到classpath和当前类的绝对路径的一些方法。
你可能需要使用其中的一些方法来得到你需要的资源的绝对路径。
1,FileTest.class.getResource("")得到的是当前类FileTest.class文件的URI目录。
不包括自己!如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/2,FileTest.class.getResource("/")得到的是当前的classpath的绝对URI路径。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/3,Thread.currentThread().getContextClassLoader().getResource("")得到的也是当前ClassPath的绝对URI路径。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/4,FileTest.class.getClassLoader().getResource("")得到的也是当前ClassPath的绝对URI路径。
如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/5,ClassLoader.getSystemResource("")得到的也是当前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中各种相对路径非常多,不容易使用,非常容易出错。
因此,我编写了一个便利方法,帮助更容易的解决相对路径问题。
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 相对路径)方法,只能接受一般的相对路径。