日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java路径问题

發(fā)布時(shí)間:2025/3/8 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java路径问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Java路徑

  Java中使用的路徑,分為兩種:絕對路徑和相對路徑。具體而言,又分為四種:

  一、URI形式的絕對資源路徑

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b

  URL是URI的特例。URL的前綴/協(xié)議,必須是Java認(rèn)識的。URL可以打開資源,而URI則不行。

  URL和URI對象可以互相轉(zhuǎn)換,使用各自的toURI(),toURL()方法即可!

  二、本地系統(tǒng)的絕對路徑

  D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b

  Java.io包中的類,需要使用這種形式的參數(shù)。

  但是,它們一般也提供了URI類型的參數(shù),而URI類型的參數(shù),接受的是URI樣式的String。因此,通過URI轉(zhuǎn)換,還是可以把URI樣式的絕對路徑用在java.io包中的類中。

  三、相對于classpath的相對路徑

  如:相對于

  file:/D:/java/eclipse32/workspace/jbpmtest3/bin/這個(gè)路徑的相對路徑。其中,bin是本項(xiàng)目的classpath。所有的Java源文件編譯后的.class文件復(fù)制到這個(gè)目錄中。

  四、相對于當(dāng)前用戶目錄的相對路徑

  就是相對于System.getProperty("user.dir")返回的路徑。

  對于一般項(xiàng)目,這是項(xiàng)目的根路徑。對于JavaEE服務(wù)器,這可能是服務(wù)器的某個(gè)路徑。這個(gè)并沒有統(tǒng)一的規(guī)范!

  所以,絕對不要使用“相對于當(dāng)前用戶目錄的相對路徑”。然而:

  默認(rèn)情況下,java.io 包中的類總是根據(jù)當(dāng)前用戶目錄來分析相對路徑名。此目錄由系統(tǒng)屬性 user.dir 指定,通常是 Java 虛擬機(jī)的調(diào)用目錄。

  這就是說,在使用java.io包中的類時(shí),最好不要使用相對路徑。否則,雖然在J2SE應(yīng)用程序中可能還算正常,但是到了J2EE程序中,一定會(huì)出問題!而且這個(gè)路徑,在不同的服務(wù)器中都是不同的!

  相對路徑最佳實(shí)踐

  推薦使用相對于當(dāng)前classpath的相對路徑

  因此,我們在使用相對路徑時(shí),應(yīng)當(dāng)使用相對于當(dāng)前classpath的相對路徑。

  ClassLoader類的getResource(String name),getResourceAsStream(String name)等方法,使用相對于當(dāng)前項(xiàng)目的classpath的相對路徑來查找資源。

  讀取屬性文件常用到的ResourceBundle類的getBundle(String path)也是如此。

  通過查看ClassLoader類及其相關(guān)類的源代碼,我發(fā)現(xiàn),它實(shí)際上還是使用了URI形式的絕對路徑。通過得到當(dāng)前classpath的URI形式的絕對路徑,構(gòu)建了相對路徑的URI形式的絕對路徑。(這個(gè)實(shí)際上是猜想,因?yàn)镴DK內(nèi)部調(diào)用了SUN的源代碼,而這些代碼不屬于JDK,不是開源的。)
??????相對路徑本質(zhì)上還是絕對路徑

  因此,歸根結(jié)底,Java本質(zhì)上只能使用絕對路徑來尋找資源。所有的相對路徑尋找資源的方法,都不過是一些便利方法。不過是API在底層幫助我們構(gòu)建了絕對路徑,從而找到資源的!

  得到classpath和當(dāng)前類的絕對路徑的一些方法

  下面是一些得到classpath和當(dāng)前類的絕對路徑的一些方法。你可能需要使用其中的一些方法來得到你需要的資源的絕對路徑。

  1.FileTest.class.getResource("")

  得到的是當(dāng)前類FileTest.class文件的URI目錄。不包括自己!

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

  2.FileTest.class.getResource("/")

  得到的是當(dāng)前的classpath的絕對URI路徑。

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

  3.Thread.currentThread().getContextClassLoader().getResource("")

  得到的也是當(dāng)前ClassPath的絕對URI路徑。

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

  4.FileTest.class.getClassLoader().getResource("")

  得到的也是當(dāng)前ClassPath的絕對URI路徑。

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

  5.ClassLoader.getSystemResource("")

  得到的也是當(dāng)前ClassPath的絕對URI路徑。

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

  我推薦使用Thread.currentThread().getContextClassLoader().getResource("")來得到當(dāng)前的classpath的絕對路徑的URI表示法。

  Web應(yīng)用程序中資源的尋址

  上文中說過,當(dāng)前用戶目錄,即相對于System.getProperty("user.dir")返回的路徑。

  對于JavaEE服務(wù)器,這可能是服務(wù)器的某個(gè)路徑,這個(gè)并沒有統(tǒng)一的規(guī)范!

  而不是我們發(fā)布的Web應(yīng)用程序的根目錄!

  這樣,在Web應(yīng)用程序中,我們絕對不能使用相對于當(dāng)前用戶目錄的相對路徑。

  在Web應(yīng)用程序中,我們一般通過ServletContext.getRealPath("/")方法得到Web應(yīng)用程序的根目錄的絕對路徑。

  這樣,我們只需要提供相對于Web應(yīng)用程序根目錄的路徑,就可以構(gòu)建出定位資源的絕對路徑。

  這是我們開發(fā)Web應(yīng)用程序時(shí)一般所采取的策略。

?????? *用來加載類,classpath下的資源文件,屬性文件等。

  *getExtendResource(StringrelativePath)方法,可以使用../符號來加載classpath外部的資源。

  */

  publicclass ClassLoaderUtil {

   privatestatic Log log=LogFactory.getLog(ClassLoaderUtil.class);

   /**

   *Thread.currentThread().getContextClassLoader().getResource("")

   */

   /**

   *加載Java類。 使用全限定類名

   *@paramclassName

   *@return

   */

   publicstatic Class loadClass(String className) {

    try {

     return getClassLoader().loadClass(className);

    } catch (ClassNotFoundException e) {

     thrownew RuntimeException("class not found '"+className+"'", e);

    }

   }

   /**

   *得到類加載器

   *@return

   */

   publicstatic ClassLoader getClassLoader() {

    return ClassLoaderUtil.class.getClassLoader();

   }

   /**

   *提供相對于classpath的資源路徑,返回文件的輸入流

   *@paramrelativePath必須傳遞資源的相對路徑。是相對于classpath的路徑。如果需要查找classpath外部的資源,需要使用 ../來查找

   *@return 文件輸入流

   *@throwsIOException

   *@throwsMalformedURLException

   */

   publicstatic InputStream getStream(String relativePath) throws MalformedURLException, IOException {

    if(!relativePath.contains("../")){

     return getClassLoader().getResourceAsStream(relativePath);

    }else{

     return ClassLoaderUtil.getStreamByExtendResource(relativePath);

    }

   }

   /**

   *

   *@paramurl

   *@return

   *@throwsIOException

   */

   publicstatic InputStream getStream(URL url) throws IOException{

    if(url!=null){

     return url.openStream();

    }else{

     returnnull;

    }

   }

   /**

   *

   *@paramrelativePath必須傳遞資源的相對路徑。是相對于classpath的路徑。如果需要查找classpath外部的資源,需要使用 ../來查找

   *@return

   *@throwsMalformedURLException

   *@throwsIOException

   */

   publicstatic InputStream getStreamByExtendResource(String relativePath) throws MalformedURLException, IOException{

    return ClassLoaderUtil.getStream(ClassLoaderUtil.getExtendResource(relativePath));

   }

  

   /**

   *提供相對于classpath的資源路徑,返回屬性對象,它是一個(gè)散列表

   *@paramresource

   *@return

   */

   publicstatic Properties getProperties(String resource) {

    Properties properties = new Properties();

    try {

     properties.load(getStream(resource));

    } catch (IOException e) {

     thrownew RuntimeException("couldn't load properties file '"+resource+"'", e);

    }

    return properties;

   }

   /**

   *得到本Class所在的ClassLoader的Classpat的絕對路徑。

   *URL形式的

   *@return

   */

   publicstatic String getAbsolutePathOfClassLoaderClassPath(){

    ClassLoaderUtil.log.info(ClassLoaderUtil.getClassLoader().getResource("").toString());

    return ClassLoaderUtil.getClassLoader().getResource("").toString();

   }

   /**

   *

   *@paramrelativePath 必須傳遞資源的相對路徑。是相對于classpath的路徑。如果需要查找classpath外部的資源,需要使 用../來查找

   *@return資源的絕對URL

   *@throwsMalformedURLException

   */

   publicstatic URL getExtendResource(String relativePath) throws MalformedURLException{

    ClassLoaderUtil.log.info("傳入的相對路徑:"+relativePath) ;

    //ClassLoaderUtil.log.info(Integer.valueOf(relativePath.indexOf("../"))) ;

    if(!relativePath.contains("../")){

     return ClassLoaderUtil.getResource(relativePath);

    }

    String classPathAbsolutePath=ClassLoaderUtil.getAbsolutePathOfClassLoaderClassPath();

    if(relativePath.substring(0, 1).equals("/")){

     relativePath=relativePath.substring(1);

    }

    ClassLoaderUtil.log.info(Integer.valueOf(relativePath.lastIndexOf("../"))) ;

    String wildcardString=relativePath.substring(0,relativePath.lastIndexOf("../")+3);

    relativePath=relativePath.substring(relativePath.lastIndexOf("../")+3);

    int containSum=ClassLoaderUtil.containSum(wildcardString, "../");

    classPathAbsolutePath= ClassLoaderUtil.cutLastString(classPathAbsolutePath, "/", containSum);

    String resourceAbsolutePath=classPathAbsolutePath+relativePath;

    ClassLoaderUtil.log.info("絕對路徑:"+resourceAbsolutePath) ;

    URL resourceAbsoluteURL=new URL(resourceAbsolutePath);

    return resourceAbsoluteURL;

   }

   /**

   *

   *@paramsource

   *@paramdest

   *@return

   */

   privatestaticint containSum(String source,String dest){

    int containSum=0;

    int destLength=dest.length();

    while(source.contains(dest)){

     containSum=containSum+1;

     source=source.substring(destLength);

    }

    return containSum;

   }

   /**

   *

   *@paramsource

   *@paramdest

   *@paramnum

   *@return

   */

   privatestatic String cutLastString(String source,String dest,int num){

    // String cutSource=null;

    for(int i=0;i
     source=source.substring(0, source.lastIndexOf(dest, source.length()-2)+1);

    }

    return source;

   }

   /**

   *

   *@paramresource

   *@return

   */

   publicstatic URL getResource(String resource){

    ClassLoaderUtil.log.info("傳入的相對于classpath的路徑:"+resource) ;

    return ClassLoaderUtil.getClassLoader().getResource(resource);

   }

   /**

   *@paramargs

   *@throwsMalformedURLException

   */

   publicstaticvoid main(String[] args) throws MalformedURLException {

    //ClassLoaderUtil.getExtendResource("../spring/dao.xml");

    //ClassLoaderUtil.getExtendResource("../../../src/log4j.properties");

    ClassLoaderUtil.getExtendResource("log4j.properties");

    System.out.println(ClassLoaderUtil.getClassLoader().getResource("log4j.properties").toString());

   }

  }

  后記

  ClassLoaderUtil類的public static URL getExtendResource(String relativePath),雖然很簡單,但是確實(shí)可以解決大問題。

  不過這個(gè)方法還是比較簡陋的。我還想在未來有空時(shí),進(jìn)一步增強(qiáng)它的能力。比如,增加Ant風(fēng)格的匹配符。用**代表多個(gè)目錄,*代表多個(gè)字符,?代表一個(gè)字符。達(dá)到Spring那樣的能力,一次返回多個(gè)資源的URL,進(jìn)一步方便大家開發(fā)。

  總結(jié):

  1.盡量不要使用相對于System.getProperty("user.dir")當(dāng)前用戶目錄的相對路徑。這是一顆×××,隨時(shí)可能要你的命。

  2.盡量使用URI形式的絕對路徑資源。它可以很容易的轉(zhuǎn)變?yōu)閁RI,URL,File對象。

  3.盡量使用相對classpath的相對路徑。不要使用絕對路徑。使用上面ClassLoaderUtil類的public static URL getExtendResource(String relativePath)方法已經(jīng)能夠使用相對于classpath的相對路徑定位所有位置的資源。

  4.絕對不要使用硬編碼的絕對路徑。因?yàn)?#xff0c;我們完全可以使用ClassLoader類的getResource("")方法得到當(dāng)前classpath的絕對路徑。

  使用硬編碼的絕對路徑是完全沒有必要的!它一定會(huì)讓你死的很難看!程序?qū)o法移植!

  如果你一定要指定一個(gè)絕對路徑,那么使用配置文件,也比硬編碼要好得多!

  當(dāng)然,我還是推薦你使用程序得到classpath的絕對路徑來拼資源的絕對路徑!

轉(zhuǎn)載于:https://blog.51cto.com/zhouhua/156306

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的java路径问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。