2011-11-30 29 views
12

Tôi có ít kiến ​​thức về Java. Tôi cần phải xây dựng một biểu diễn chuỗi của một URI từ FilePath(String) trên cửa sổ. Đôi khi, số inputFilePath Tôi nhận được là: file:/C:/a.txt và đôi khi là: C:/a.txt. Ngay bây giờ, những gì tôi đang làm là:Java: Nhận URI từ FilePath

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

Các công trình trên tốt cho con đường, mà không được bắt đầu bằng file:/, nhưng đối với con đường bắt đầu bằng file:/ thì. Phương pháp toURI đang chuyển đổi nó thành URI không hợp lệ, bằng cách thêm giá trị của dir hiện tại và do đó đường dẫn trở nên không hợp lệ.

Hãy giúp tôi bằng cách đề xuất một cách chính xác để có được URI thích hợp cho cả hai loại đường dẫn.

+1

Có đủ để chỉ xóa 'tệp: /' khỏi đầu chuỗi nếu có? Hoặc có thể có các tiền tố hợp lệ khác? – Thomas

Trả lời

11

Đây là những uri hồ sơ hợp lệ:

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

Vì vậy, bạn sẽ cần phải loại bỏ file:/ hoặc file:/// cho Windows và file:// cho Linux.

1

Đối số cho new File(String) là đường dẫn chứ không phải là URI. Tuy nhiên, một phần của bài đăng của bạn sau 'nhưng' là do sử dụng API không hợp lệ.

+0

Vậy tôi nên chuyển đổi URI thành đường dẫn như thế nào? Về cơ bản, để có được một con đường mà không phải là tiền tố với "file:" – HarshG

+0

@ user1073005 'URI mới (uri) .getPath()', nhưng đây là một câu hỏi mới, phải không? Câu hỏi của bạn ở trên là về cách 'xây dựng một biểu diễn chuỗi của một URI'. – EJP

+0

Xin lỗi vì sự đốt cháy ... – 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); 
    } 
} 

Cung cấp đầu ra:

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

Tôi khuyên bạn nên sử dụng 'StringUtils.removeStart (...) ':' brokenPath = StringUtils.removeStart (brokenPath, "file: /") '. – Thomas

4

Từ SAXLocalNameCount.java từ 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

Tuyệt vời, hoạt động như một sự quyến rũ! – Andrei

+3

từ JavaSE7 nào đó một dòng ... \t \t 'java.nio.file.FileSystems.getDefault(). GetPath (xmlFileAsString) .toAbsolutePath(). ToUri() ' \t \t Returns ví dụ. '" tệp: /// C: /develop/doku/projects/Documentry/THB/src/docbkx/Systemvoraussetzungen.xml "' – udoline

3

Chỉ cần sử dụng Normalize();

Ví dụ:

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

một dòng này sẽ bình thường tất cả các con đường của bạn.

Các vấn đề liên quan