版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、java路径问题最终解决方案一可定位所冇资源的相对路径寻址-编程 开发技术java路径问题最终解决方案一可定位所 有资源的相对路径寻址原文出处:良少刖§java的路径问题,非常难搞。最近的工作涉及到创建和读取文件的工作,这里 我就给大家彻底得解决java路径问题。我编写了一个方法,比classloadcr. gctrcsourcc(string相对路径)方法的能 力更强。它可以接受“/”这样的参数,允许我们用相对路径来定位classpath 外面的资源。这样,我们就可以使用相对于classpath的路径,定位所有位置的 资源!java路径java屮使用的路径,分为两种:绝对路径和相对
2、路径。具体而言,乂分为四种:一. uri形式的绝对资源路径女口: file:/d:/java/eclipse32/workspace/jbpmtest3/bin/aem. burl是uri的特例。url的前缀/协议,必须是java认识的。url可以打开资源, 而ur1则不行。url和uri对象可以互相转换,使用各自的tourlo, tourlo方法即可!二、本地系统的绝对路径d:/java/cclipsc32/workspace/jbpmtcst3/bin/aaa bjava, io包屮的类,需要使用这种形式的参数。但是,它们一般也提供了 uri类型的参数,而uri类型的参数,接受的是uri
3、样式的stringo因此,通过uri转换,述是可以把uri样式的绝对路径用在 java, io包中的类中。三、相对于classpath的相对路径如:相对于f ile:/d:/java/ecl ipse32/workspace/ jbpmtest3/bin/这个路径的相对路径。其 中,bin是本项目的classpatho所有的java源文件编译后的.class文件复制 到这个目录中。四、相对于当前用户目录的相对路径就是相对t* system. getproperty ( "user, dir”)返回的路径。对于一般项目,这是项目的根路径。对于javaee服务器,这町能是服务器的某 个路
4、径。这个并没有统一的规范!所以,绝对不要使用“相对于当前用户目录的相对路径”。然而:默认情况下,java, io包中的类总是根据当前用户目录来分析相对路径名。此 目录由系统属性user, dir指定,通常是java虚拟机的调用目录。这就是说,在使用java. io包中的类时,最好不要使用相对路径。否则,虽然在 j2se应用程序中可能还算止常,但是到了 j2ee程序中,一定会出问题!而且这 个路径,在不同的服务器屮都是不同的!相对路径最佳实践推荐使用相对于当前classpath的相对路径因此,我们在使用相对路径时,应当使用相对于当前classpath的相对路径。classloader 类的
5、163;etresource (string name), getresourceasstream (stting name)等方法,使用相对于当前项口的classpath的相对路径来查找资源。读取属性文件常用到的resourcebundle类的getbundle (string path)也是如 此。通过查看classloader类及其相关类的源代码,我发现,它实际上还是使用了 uri形式的绝对路径。通过得到当前classpath的uri形式的绝对路径,构建了 相对路径的uri形式的绝对路径。(这个实际上是猜想,因为jdk内部调用了 su7的源代码,而这些代码不属于jdk,不是开源的。)相对
6、路径本质上还是绝对路径因此,归根结底,java本质上只能使用绝对路径来寻找资源。所有的相对路径 寻找资源的方法,都不过是一些便利方法。不过是api在底层帮助我们构建了 绝对路径,从而找到资源的!得到classpath和当前类的绝对路径的一些方法下面是一些得到classpath和当前类的绝对路径的一些方法。你可能需要使用其 屮的一些方法来得到你需要的资源的绝对路径。1, filetest.classgetresource("” )得到的是当前类f订etest, class文件的uri目录。不包括自己!女i丨:file:/d:/java/eclipse32/workspace/jbpmt
7、est3/bin/com/test/2, filetest. class. getresource( “/”)得到的是当前的classpath的绝对uri路径。女l【:file:/d:/java/eclipse32/workspace/jbpmtest3/bin/3,thread currentthread() getcontextclassloader () getresource ( “”)得到的也是当前classpath的绝对uri路径。女口: file:/d:/java/eclipse32/workspace/jbpmtest3/bin/3, filetest.classgetclas
8、sloader()getresource()得到的也是当前classpath的绝对uri路径。女口: file:/d:/java/eclipse32/workspace/jbpmtest3/bin/得到的也是当前classpath的绝对uri路径。女口: file:/d:/java/eclipse32/workspace/jbpmtest3/bin/我推荐使用thread. currentthread (). getcontex tclassloader (). get resource ( “ ”)来得 到当前的classpath的绝对路径的uri表示法。web应用程序中资源的寻址上文中说过
9、,当前用户目录,即相对于system. getproperty( “user, dir”)返 回的路径。对于javaee服务器,这可能是服务器的某个路径,这个并没冇统一的规范!而不是我们发布的web应用程序的根目录!这样,在web应用程序屮,我们绝对不能使用相对于当前用户口录的相对路径。在web应用程序中,我们一般通servletcontext. getrealpath( "/”)方法得 到web应用程序的根目录的绝对路径。这样,我们只需要提供相对于web应用程序根目录的路径,就可以构建出定位资 源的绝对路径。这是我们开发web应用程序吋-般所采取的策略。通用的相对路径解决办法jav
10、a各种相对路径非常多,不容易使用,非常容易岀错。因此,我编写了一 个便利方法,帮助更容易的解决相对路径问题。web应用程序中使用javase运行的资源寻址问题在javase程序中,我们一般使用classpath 作为存放资源的目的地。但是, 在web应用程序屮,我们一般使用classpath外而的web-inf及其子目录作为资 源文件的存放地。在web应用程序屮,我们一般通过seiwletcontext. getrealpath()方法得到web应用程序的根目录的绝对路径。这样,我们只需要提供相对于web应用程 序根口录的路径,就可以构建出定位资源的绝对路径。web应用程序,可以作为web应用
11、程序进行发布和运行。但是,我们也常常会以 javase的方式来运行web应用程序的某个类的main方法。或者,使用junit测 试。这都需要使用javase的方式来运行。这样,我们就无法使用servletcontext. getrealpath()方法得到web应用程序的根口录的绝对路径。而jdk提供的classloader类,它的 gctrcsourcc(string name), getresourceasstream(string name)等方法, 使用相对于当前项目的classpath的相对路径来查找资源。读取属性文件常用到的resourcebundle类的getbundle (st
12、ring path)也是如 此。它们都只能使用相对路径來读取classpath下的资源,无法定位到classpath 外面的资源。classpath外配置文件读取问题1!如,我们使用测试驱动开发的方法,开发spring、hibernate、ibatis等使用配 置文件的web应用程序,就会遇到问题。尽管spring自己提供t filesystem (也就是相对于user, dir目录)来读取web 配置文件的方法,但是终究不是很方便。而且与web程序中的代码使用方式不一 致!至于hibernate, ibatis就更麻烦了!只有把配置文件移至!j classpath下,否则 根木不可能使用测试
13、驱动开发!这怎么办?通用的相对路径解决办法面对这个问题,我决定编写一个助手类classloaderutil,提供一个便利方法 public?static?url getextendresource (string relativepath)。在 web 应用 程序等一切java程序中,需要定位classpath外的资源时,都使用这个助手类 的便利方法,血不使用web应用程序特有的servletcontext. gctrcalpath( ) 方法来定位资源。利用classpath的绝对路径,定位所有资源这个便利方法的实现原理,就是“利用classpath的绝对路径,定位所自资源”。classlo
14、ader类的getresource( “ ”)方法能够得到当前classpath的绝对路径, 这是所fjava程序都拥有的能力,具有最大的适应性! 而目而的jdk提供的classloader类的gctrcsourcc (string相对路径)方法, 只能接受一般的相对路径。这样,使用classloader类的getresource (string相 对路径)方法就只能定位到classpath下的资源。如果,它能够接受“/”这样的参数,允许我们用相对路径来定位classpath 外面的资源,那么我们就可以定位位置的资源!当然,我无法修改classloader类的这个方法,于是,我编写了一个助手类
15、 classloaderutil 类,捉供了 public?static?url getextendresource(string relativepath)这个方法。它能够接受带有符号的相对路径,实现了自 由寻找资源的功能。通过相对classpath路径实现自由寻找资源的助手类的源代码:import java io. ioexccption;import java. io. inputstream;import .malfonnedurlexception;import java.nel. url;import java .util. properties;import org apache
16、, commons, logging. log;import org.apache. commons. logging. logfactory;/*author 沈东良 shendl shotmail. com*nov29, 2006 10:34:34am*用來加载类,c 1 a s s p a t h下的资源文件,属性文件等。getextendresource (stringrelativepath)方法,可以使用/符号来加载 classpath外部的资源。*/publicclass classloaderutil privatestatic log log二logfactory. getl
17、og(c1assloaderuti1. class); /*thread, currentthreeid() getcontextclassloader () getresource ("") */*加载java类。使用全限定类名©paramclassname*©return*/publicstatic class loadclass(string classname) try return getclassloader(). loadclass(classname); catch (classnotfoundexception e) thrownew
18、runtimeexception(z/class not found +classname+ e);*得到类加载器*return*/publicstatic classloader getclassloader() return classloaderutil. class. getclassloader();/*捉供相对classpath的资源路径,返回文件的输入流qparamrelativepath必须传递资源的相对路径。是相对于classpath 的路径。如果需要查找classpath外部的资源,需要使用/来查找*return文件输入流*throwsioexccption*throwsm
19、alformedurlexception*/publicstatic inputstream getstream(string relativepath) throws maiformedurlexception, toexception if (irclativcpath contains("/") returngetclassloader (). getresourceasstream(relativepath);else returnclassloaderutil. getstreamb)extendresource(relativepath);/*©par
20、amurl*©return*throwsloexcept i on*/publicstatic inputstream getstream(url url) throws ioexception if (url!=null)return url. openstream();else returnnull;/*paramre 1 ativepath必须传递资源的相对路径。是相对于classpath 的路径。如果需要查找classpath外部的资源,需要使用/來查找*rcturn*throwsmalformedurlexception*throwsioexcept ion*/publ i
21、cstatic tnputstream getstreamb)extendresource(string rclativcpath) throws malformcdurlexccption, ioexccptionreturnclassloaderutil. getstream(classloaderutil. getextendresource(relativep ath);/*提供相对于classpath的资源路径,返回属性对象,它是一个散列表*paramresource*rcturn*/ publicstatic properties getproperties (string res
22、ource) properties properties 二 new properties();try propertics. load(gctstrcom (resource); catch (ioexception e) thrownew runtimeexception(couldn5 t load properties file /z+resource+z/,"、e);return propertics;*得到木class所在的classloader的classpat的绝对路径。*url形式的*©return*/publicstatic string getabso
23、lutepathofclassloaderclasspath() classloaderutil. log. info(classloaderutil. getclassloader(). getresource (") tostring ();returnclassloaderutil. £et classloader (). get resource (z/z/). tostrin g();*paramrelativepath必须传递资源的相对路径。是相对于classpath 的路径。如果需要杳找classpath外部的资源,需要使用/來查找*return资源的绝对ur
24、l*©throwsmalformedurlexception*/publicstatic url getextendresource(string relativepath) tbrows maiformcdurlexccpt i onclassloaderutil. log. info(,z传入的相对路径:"+relativepath);/classloaderutil. log. info(tnteger. valueof(relativepath. indexof(/ );if (irelativepath contains(z,. /") return c
25、lassloaderutil. getresource(relativepath);stringclasspathabsolutepath二classloaderutil. getabsolutepathofclassloadercla sspatho ;if(relativepath. substring(0, 1). equals(/)re1 ativepath=re1 ativepath. substring(l);classloaderutil. log. info (integer. valueof (relativepath. lastlndexof (z,. /);stringw
26、ildcardstring二relativepath. substring(o, relativepath. lastlndexof(/ )+3);relativepath=relativepath. substring(relativepath. lastlndexof (/z. . /)+3 );int containsum=classloaderutil. containsum(wildcardstring,”n ;classpathabsolutcpath=classloaderutil.cutlaststring(classpathabsolutepath,containsum);s
27、tring resourceabsolutepath=classpathabsolutepath+relativepath;classloaderutil. log. info(z,绝对路径:,z+resourceabsolutepath); url rcsourccabsolutcurl二new url(rcsourccabsolutcpath); return resourceabsoluteurl;/*paramsourcc©paramdest©return*/privatestaticint containsum(string source,string dest)
28、 int containsum二0;int destlength=dest. length();while (source, contains(dest) containsum=containsum+1; source二source, substring(destlength);return containsum;/*©paramsource*©paramdest*paramnum*rcturn*/privatestatic string cutlaststring(string source, string dest, int num) / string cutsourc
29、e二null;for(int i二0;inum;i+) source=source. substring(0, source.lastlndexof (dest, source, length () -2)+1);return source;/*paramresource©return*/publicstatic url getresource(string resource) classloadcrutil. log. info("传入的相对于 classpath 的路径: ,z+resource);return classloaderutil. getclassloader(). getresource(resource);/*©paramargs*©throwsmalformedurlexcept i on*/publicstaticvoid main(string args) throws malformcdurlexccption
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年肠道传染病消毒隔离培训
- 2026年实验室生物安全隐患排查与奖惩管理办法
- 2026年手机充电器长期不拔引发火灾事故警示
- 2026年房地产代建项目拓展与运营管理整合
- 2026年公司职业健康监护档案管理制度
- 2025甘肃省白银市中考英语真题(原卷版)
- 2025湖北省中考物理试题(解析版)
- 2026年某公司合规管理实施细则
- 2026年深基坑开挖风险辨识与坍塌应急措施
- 2026年新时代乡风文明建设的困境与突破路径
- 检验检测机构内审员考试试卷(附答案)
- 《文言文二则》(第1课时)教学课件
- 公司技术部工作管理制度
- DB5309-T 83-2025 临沧市暴雨强度公式
- T/CECS 10274-2023防沉降井盖
- DB31/T 875-2015人身损害受伤人员休息期、营养期、护理期评定准则
- 审计岗位笔试试题及答案
- GB/T 37507-2025项目、项目群和项目组合管理项目管理指南
- 2023年内蒙古高校毕业生“三支一扶”社区民生工作招募考试《综合能力测试》真题及答案
- 高危产妇专案管理制度
- 大订单管理制度
评论
0/150
提交评论