咖啡伴侶

          呆在上海
          posts - 163, comments - 156, trackbacks - 0, articles - 2

          URL問題 轉(zhuǎn)

          Posted on 2013-05-27 17:00 oathleo 閱讀(310) 評(píng)論(0)  編輯  收藏 所屬分類: Java

          Java路徑中的空格問題
          1、 URLTest.class.getResource("/").getPath();
              URLTest.class.getResource("/").getFile();
              URLTest.class.getClassLoader().getResource("").getPath();
              Thread.currentThread().getContextClassLoader().getResource("").getPath();等多種相似方式獲得的路徑,不能被FileReader()和FileWriter()直接應(yīng)用,原因是URL對(duì)空格,特殊字符(%,#,[]等)和中文進(jìn)行了編碼處理。如果文件中URLTest.class.getResource("/").getPath();必須以"/"開頭然后再加文件名,而URLTest.class.getClassLoader().getResource("").getPath();不用加"/"可以直接添加文件名。

          路徑中包含空格時(shí),如果空格變?yōu)?%20"有如下處理方法:
          1)使用repaceAll("%20",' ')替換,但只能解決空格問題,如果路徑中包含其他特殊字符和中文就不能解決問題。
          2)使用URLDecoder.decode(str,"UTF-8")解碼,但是只能解決一部分,若路徑中含有+,也是不能解決的,原因是URL并不是完全用URLEncoder.encode(str,"UTF-8")編碼的,+號(hào)被解碼后,則變成空格。
          3)解決所有的問題,用URLTest.class.getClassLoader().getResource("").toURI().getPath();,但是需要處理URISyntaxException異常,比較麻煩一些。

          2、new URL();的參數(shù)可以為正確的URI,或者為URI格式的字符串;若字符串是非完整的URI格式,則創(chuàng)建失敗。java.net.URI返回的路徑中的空格以“空格”的形式出現(xiàn)方法為Thread.currentThread().getContextClassLoader().getResource("").toURI().getPath();但是Thread.currentThread().getContextClassLoader().getResource("").toURI().toString();則會(huì)以“%20”的形式出現(xiàn)。java.net.URL返回的一切路徑中的空格都是以“%20”的形式出現(xiàn)。URL/URI返回的路徑分隔符都是“/”(控制臺(tái)輸出"/")。


          3、new File(String filePath);接受正確URI格式的參數(shù)和帶“空格”(非%20)的正確相對(duì)/絕對(duì)字符串路徑,否則即使給的路徑是正確的也會(huì)出現(xiàn)找不到文件的異常。File返回的路徑分隔符都為“\”(控制臺(tái)輸出"\"),對(duì)于存在的文件返回的路徑字符串,空格都以"空格"出現(xiàn),而不存在的路徑new出的file,getPath()返回的路徑中的空格,仍是new File(String filePath)的參數(shù)中原有的形式,即若filePath中是空格的getPath()返回的仍是空格,是“%20”的仍是“%20”。File.toURI() 會(huì)將file的路徑名中的“空格”轉(zhuǎn)化為“%20”,然后在路徑前加protocol:"file:/",而File.toURL()只會(huì)在file路徑 前簡單的加上protocol:"file:/",而不會(huì)將“空格”轉(zhuǎn)化為“%20”,原來的無論是“空格”還是“%20”都只會(huì)原樣保留。


          實(shí)際使用中遇到的問題總結(jié)如下:
          1、相對(duì)路徑(即相對(duì)于當(dāng)前用戶目錄的相對(duì)路徑)均可通過以下方式獲得(不論是一般的java項(xiàng)目還是web項(xiàng)目) String relativelyPath=System.getProperty("user.dir"); 對(duì)于一般的java項(xiàng)目中的文件是相對(duì)于項(xiàng)目的根目錄,而對(duì)于web項(xiàng)目中的文件路徑,可能是服務(wù)器的某個(gè)路徑,同時(shí)不同的web服務(wù)器也不同 (tomcat是相對(duì)于 tomcat安裝目錄\bin)。為此,個(gè)人認(rèn)為,在web項(xiàng)目中,最好不要使用“相對(duì)于當(dāng)前用戶目錄的相對(duì)路徑”。然而默認(rèn)情況下,java.io 包中的類總是根據(jù)當(dāng)前用戶目錄來分析相對(duì)路徑名。此目錄由系統(tǒng)屬性 user.dir 指定,通常是 Java 虛擬機(jī)的調(diào)用目錄。這就是說,在使用java.io包中的類時(shí),最好不要使用相對(duì)路徑。否則,雖然在SE程序中可能還算正常,但是到了EE程序中,可能會(huì)出現(xiàn)問題。

          2、web項(xiàng)目根目錄獲取
          1)建立一個(gè)servlet,在其init()方法中添加如下代碼
          ServletContext context = this.getServletContext(); 
          String strs = context.getRealPath("/"); 
          2)利用httpServletRequest,得到相應(yīng)的項(xiàng)目路徑
          String pathUrl = request.getSession().getServletContext().getRealPath("/");

          主站蜘蛛池模板: 建湖县| 舟山市| 如皋市| 阿瓦提县| 台江县| 萝北县| 泽州县| 雷山县| 永丰县| 云梦县| 区。| 旬阳县| 克什克腾旗| 商城县| 睢宁县| 衡山县| 寿光市| 康平县| 新疆| 福海县| 赞皇县| 广汉市| 固镇县| 加查县| 确山县| 温宿县| 梧州市| 曲沃县| 宣汉县| 襄汾县| 永修县| 阿图什市| 莱芜市| 文昌市| 沙湾县| 教育| 迁安市| 葫芦岛市| 民勤县| 永济市| 长丰县|