详细介绍Java路径的分类与使用注意事项

开发 后端
本文介绍的是java中路径的分类和使用时的注意事项。希望对大家有帮助,一起来看。

Java路径简单的分可以分为两种:相对路径和相对路径。 下面引见有关Java路径分类的一些细节, 以及运用Java路径时需求注意的问题。 

具体而言,Java路径又分为四种:

一、URI方式的相对资源路径如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa. b URL是URI的特例。 URL的前缀/协议, 必须是Java看法的。 URL可以打开资源, 而URI则不行。 URL和URI对象可以相互转换, 运用各自的toURI(), toURL()办法即可。 

二、本地系统的相对路径 D:/java/eclipse32/workspace/jbpmtest3/bin/aaa. b Java. 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和当前类的相对路径的一些办法。

Java路径:你能够需求运用其中的一些办法来失掉你需求的资源的相对路径。 

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下, 否则基本不能够运用测试驱动开发。

责任编辑:于铁 来源: 互联网
相关推荐

2009-08-27 10:40:56

Java路径

2009-12-22 09:48:58

WCF枚举类型

2011-03-22 08:56:30

2013-09-25 10:15:51

闪存存储优势注意事项

2009-12-14 10:08:03

无线路由猫

2011-08-01 12:53:25

iPhone 多线程 线程

2010-11-26 16:27:01

MySQL使用变量

2010-01-04 15:37:41

ADO连接

2011-06-24 09:23:02

SEO

2010-05-11 11:03:41

Mysql索引

2010-01-21 11:30:10

2009-06-12 09:46:40

Java String

2011-05-26 11:22:04

SEO

2012-03-12 16:46:22

NoSQL数据库

2011-07-28 17:29:22

HBaseShell

2010-06-21 14:39:56

光纤测试

2011-07-19 10:16:58

喷墨打印机注意事项

2010-01-18 14:25:19

使用C++Builde

2012-06-13 02:02:43

ServletJavaJSP

2012-04-10 09:53:15

点赞
收藏

51CTO技术栈公众号