Java路徑問題解決方案聚集

Java路徑中的空格問題java

一、 URLTest.class.getResource("/").getPath();web

    URLTest.class.getResource("/").getFile();tomcat

    URLTest.class.getClassLoader().getResource("").getPath();服務器

    Thread.currentThread().getContextClassLoader().getResource("").getPath();等多種類似方式得到的路徑,不能被FileReader()和FileWriter()直接應用,緣由是URL對空格,特殊字符(%,#,[]等)和中文進行了編碼處理。若是文件中URLTest.class.getResource("/").getPath();必須以"/"開頭而後再加文件名,而URLTest.class.getClassLoader().getResource("").getPath();不用加"/"能夠直接添加文件名。ide

 

路徑中包含空格時,若是空格變爲"%20"有以下處理方法:ui

1)使用repaceAll("%20",' ')替換,但只能解決空格問題,若是路徑中包含其餘特殊字符和中文就不能解決問題。this

2)使用URLDecoder.decode(str,"UTF-8")解碼,可是隻能解決一部分,若路徑中含有+,也是不能解決的,緣由是URL並非徹底用URLEncoder.encode(str,"UTF-8")編碼的,+號被解碼後,則變成空格。編碼

3)解決全部的問題,用URLTest.class.getClassLoader().getResource("").toURI().getPath();,可是須要處理URISyntaxException異常,比較麻煩一些。spa

 

二、new URL();的參數能夠爲正確的URI,或者爲URI格式的字符串;若字符串是非完整的URI格式,則建立失敗。java.net.URI返回的路徑中的空格以「空格」的形式出現方法爲Thread.currentThread().getContextClassLoader()http://www.huiyi8.com/jiaoben/網頁特效代碼 .getResource("").toURI().getPath();可是Thread.currentThread().getContextClassLoader().getResource("").toURI().toString();則會以「%20」的形式出現。java.net.URL返回的一切路徑中的空格都是以「%20」的形式出現。URL/URI返回的路徑分隔符都是「/」(控制檯輸出"/")。.net

 

 

三、new File(String filePath);接受正確URI格式的參數和帶「空格」(非%20)的正確相對/絕對字符串路徑,不然即便給的路徑是正確的也會出現找不到文件的異常。File返回的路徑分隔符都爲「\」(控制檯輸出"\"),對於存在的文件返回的路徑字符串,空格都以"空格"出現,而不存在的路徑new出的file,getPath()返回的路徑中的空格,還是new File(String filePath)的參數中原有的形式,即若filePath中是空格的getPath()返回的還是空格,是「%20」的還是「%20」。File.toURI() 會將file的路徑名中的「空格」轉化爲「%20」,而後在路徑前加protocol:"file:/",而File.toURL()只會在file路徑 前簡單的加上protocol:"file:/",而不會將「空格」轉化爲「%20」,原來的不管是「空格」仍是「%20」都只會原樣保留。

 

 

實際使用中遇到的問題總結以下:

一、相對路徑(即相對於當前用戶目錄的相對路徑)都可經過如下方式得到(不管是通常的java項目仍是web項目) String relativelyPath=System.getProperty("user.dir"); 對於通常的java項目中的文件是相對於項目的根目錄,而對於web項目中的文件路徑,多是服務器的某個路徑,同時不一樣的web服務器也不一樣 (tomcat是相對於 tomcat安裝目錄\bin)。爲此,我的認爲,在web項目中,最好不要使用「相對於當前用戶目錄的相對路徑」。然而默認狀況下,java.io 包中的類老是根據當前用戶目錄來分析相對路徑名。此目錄由系統屬性 user.dir 指定,一般是 Java 虛擬機的調用目錄。這就是說,在使用java.io包中的類時,最好不要使用相對路徑。不然,雖然在SE程序中可能還算正常,可是到了EE程序中,可能會出現問題。

 

二、web項目根目錄獲取

1)創建一個servlet,在其init()方法中添加以下代碼

ServletContext context = this.getServletContext(); 

String strs = context.getRealPath("/"); 

2)利用httpServletRequest,獲得相應的項目路徑

String pathUrl = request.getSession().getServletContext().getRealPath("/");

相關文章
相關標籤/搜索