|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在1995年5月23日以“Java”的名称正式发布了。
在java中,常常要定位某些文件的地位,为了能让程序与物理地位有关,就要利用绝对路径。但java中利用绝对路径总会碰到一些很贫苦的成绩,就是究竟相对哪一个参照物的成绩。由于我们平常利用绝对路径老是绝对以后事情目次而言的,但偶然需求并不是云云。好比,要在一个开辟包中利用绝对路径,却不晓得开辟包被其他程序挪用时的地点路径,并且出格是在web使用中,很难断定某个文件在全部使用中的绝对路径。
以是利用绝对路径最好的举措就是让路径绝对的参照物是我的开辟包或我的使用自己的工具,最好的就是用我开辟包中的类的class文件。只需晓得了某个class文件的相对路径,就能够以它为参照物,利用绝对路径来定位其他任何文件了。
为了完成这个设法,我写了这个Path类,这个类供应了两个静态大众办法,一个用来定位类的class文件的地位,另外一个以某个类为参照物来定位一个绝对路径。利用这两个办法,我们能够完整不用剖析使用确当前事情路径,为所欲为的依据本人的地位来寻觅任何文件。好比在编写某个功效性开辟包时,就能够完整不必管挪用这个开辟包的使用的路径情形,而仅仅依据开辟包自己的地位来定位文件,如许很好的完成了封装性,将文件的路径处置完整关闭在了开辟包本身以内。
以下是Path类的源代码:
*创立日期2004-11-22**变动所天生文件模板为*窗口>首选项>Java>代码天生>代码和正文*/packagemytools;
importjava.io.File;importjava.io.IOException;importjava.net.MalformedURLException;importjava.net.URL;importjava.security.CodeSource;importjava.security.ProtectionDomain;
/***@author由月**这个类供应了一些依据类的class文件地位来定位的办法。*/publicclassPath{/***猎取一个类的class文件地点的相对路径。这个类能够是JDK本身的类,也能够是用户自界说的类,大概是第三方开辟包里的类。*只需是在本程序中能够被加载的类,都能够定位到它的class文件的相对路径。**@paramcls*一个对象的Class属性*@return这个类的class文件地位的相对路径。假如没有这个类的界说,则前往null。*/publicstaticStringgetPathFromClass(Classcls)throwsIOException{Stringpath=null;if(cls==null){thrownewNullPointerException();}URLurl=getClassLocationURL(cls);if(url!=null){path=url.getPath();if("jar".equalsIgnoreCase(url.getProtocol())){try{path=newURL(path).getPath();}catch(MalformedURLExceptione){}intlocation=path.indexOf("!/");if(location!=-1){path=path.substring(0,location);}}Filefile=newFile(path);path=file.getCanonicalPath();}returnpath;}
/***这个办法能够经由过程与某个类的class文件的绝对路径来猎取文件或目次的相对路径。一般在程序中很难定位某个绝对路径,出格是在B/S使用中。*经由过程这个办法,我们能够依据我们程序本身的类文件的地位来定位某个绝对路径。*好比:某个txt文件相对程序的Test类文件的路径是../../resource/test.txt,*那末利用本办法Path.getFullPathRelateClass("../../resource/test.txt",Test.class)*失掉的了局是txt文件的在体系中的相对路径。**@paramrelatedPath*绝对路径*@paramcls*用来定位的类*@return绝对路径所对应的相对路径*@throwsIOException*由于本办法将查询文件体系,以是大概抛出IO非常*/publicstaticStringgetFullPathRelateClass(StringrelatedPath,Classcls)throwsIOException{Stringpath=null;if(relatedPath==null){thrownewNullPointerException();}StringclsPath=getPathFromClass(cls);FileclsFile=newFile(clsPath);StringtempPath=clsFile.getParent()+File.separator+relatedPath;Filefile=newFile(tempPath);path=file.getCanonicalPath();returnpath;}
/***猎取类的class文件地位的URL。这个办法是本类最基本的办法,供别的办法挪用。*/privatestaticURLgetClassLocationURL(finalClasscls){if(cls==null)thrownewIllegalArgumentException("nullinput:cls");URLresult=null;finalStringclsAsResource=cls.getName().replace(.,/).concat(".class");finalProtectionDomainpd=cls.getProtectionDomain();//java.lang.Classcontractdoesnotspecify//ifpdcaneverbenull;//itisnotthecaseforSunsimplementations,//butguardagainstnull//justincase:if(pd!=null){finalCodeSourcecs=pd.getCodeSource();//cscanbenulldependingon//theclassloaderbehavior:if(cs!=null)result=cs.getLocation();
if(result!=null){//Convertacodesourcelocationinto//afullclassfilelocation//forsomecommoncases:if("file".equals(result.getProtocol())){try{if(result.toExternalForm().endsWith(".jar")||result.toExternalForm().endsWith(".zip"))result=newURL("jar:".concat(result.toExternalForm()).concat("!/").concat(clsAsResource));elseif(newFile(result.getFile()).isDirectory())result=newURL(result,clsAsResource);}catch(MalformedURLExceptionignore){}}}}
if(result==null){//Trytofindclsdefinitionasaresource;//thisisnot//document.dtobelegal,butSuns//implementationsseemto//allowthis:finalClassLoaderclsLoader=cls.getClassLoader();result=clsLoader!=null?clsLoader.getResource(clsAsResource):ClassLoader.getSystemResource(clsAsResource);}returnresult;}
publicstaticvoidmain(String[]args){try{System.out.println(getPathFromClass(Path.class));System.out.println(getFullPathRelateClass("../test/abc/..",Path.class));}catch(Exceptione){e.printStackTrace();}}}
关于第二点:俺问问你,如果是企业级项目的话,诸如RMI,EJB,等一些关键技术,这些难道都不需要学么?如果光是使用jsp,servlet,javabean的话。 |
|