2011-11-30 74 views
12

我對Java很少了解。我需要在窗口上構建一個來自FilePath(String)的URI的字符串表示。有時我得到的inputFilePath是:file:/C:/a.txt,有時它是:C:/a.txt。現在,我在做什麼是:Java:從FilePath獲取URI

new File(inputFilePath).toURI().toURL().toExternalForm() 

以上工作正常的路徑,這是不以file:/前綴,但路徑前綴file:/的。 toURI方法通過附加當前目錄的值將其轉換爲無效的URI,因此該路徑變爲無效。

請幫助我通過建議一種正確的方式來獲得這兩種路徑的正確的URI。

+1

只要從字符串的開頭刪除'file:/'(如果存在)就足夠了嗎?或者可能還有其他有效的前綴? – Thomas

回答

11

這些都是有效的文件URI:

file:/C:/a.txt   <- On Windows 
file:///C:/a.txt   <- On Windows 
file:///home/user/a.txt <- On Linux 

所以,你將需要刪除的Win​​dows file:/file:///file://的Linux版本。

1

new File(String)的參數是一個路徑,而不是URI。 'but'後的帖子部分因此是API的無效使用。

+0

那麼我該怎麼做才能將URI轉換爲路徑?從本質上講,要得到一個沒有以「file:」 – HarshG

+0

@ user1073005'new URI(uri).getPath()'爲前綴的路徑,但這是一個新問題,不是嗎?上面的問題是關於如何「構建URI的字符串表示」。 – EJP

+0

對不起,我的... – HarshG

0
class TestPath { 

    public static void main(String[] args) { 
     String brokenPath = "file:/C:/a.txt"; 

     System.out.println(brokenPath); 

     if (brokenPath.startsWith("file:/")) { 
      brokenPath = brokenPath.substring(6,brokenPath.length()); 
     } 
     System.out.println(brokenPath); 
    } 
} 

給出輸出:

file:/C:/a.txt 
C:/a.txt 
Press any key to continue . . . 
+0

我建議使用Apache Commons的''StringUtils.removeStart(...)':'brokenPath = StringUtils.removeStart(brokenPath,「file:/」)'。 – Thomas

4

從SAXLocalNameCount.java從https://jaxp.java.net

/** 
* Convert from a filename to a file URL. 
*/ 
private static String convertToFileURL (String filename) 
{ 
    // On JDK 1.2 and later, simplify this to: 
    // "path = file.toURL().toString()". 
    String path = new File (filename).getAbsolutePath(); 
    if (File.separatorChar != '/') 
    { 
     path = path.replace (File.separatorChar, '/'); 
    } 
    if (!path.startsWith ("/")) 
    { 
     path = "/" + path; 
    } 
    String retVal = "file:" + path; 

    return retVal; 
} 
+0

令人驚歎,作品像一個魅力! – Andrei

+3

因爲JavaSE7做這一行... \t \t 'java.nio.file.FileSystems.getDefault()的getPath(xmlFileAsString).toAbsolutePath()。toUri()' \t \t 返回如。 ' 「文件:/// C:/develop/doku/projects/Documentry/THB/src/docbkx/Systemvoraussetzungen.xml」' – udoline

3

只需使用Normalize();

例子:

path = Paths.get("/", input).normalize(); 

這一行會正常化所有的路徑。