如何在Java和Windows中获取正确的URI

时间:2018-07-15 21:32:21

标签: java windows url webview uri

Wikipedia中,它说:

Windows

  

以下是一些示例,它们可以被Windows系统上的某些应用程序接受,它们引用相同的本地文件c:\ WINDOWS \ clock.avi

file://localhost/c:/WINDOWS/clock.avi
file:///c:/WINDOWS/clock.avi
     

这是Windows Shell API理解的URI:[2]

file:///c:/WINDOWS/clock.avi

假设我需要将文件名类型:C:\WINDOWS\clock.avi转换为URI,以便在JavaFX WebView中用作标签,css,链接等的href。

该应用根据链接(运行pdf,互联网,音乐等)拦截对链接的点击,分析并执行操作

但是,我无法从要在这些Webview页面中使用的文件名生成正确的URI。

这些是Java提供的结果:

代码

private static void print(String s) {
    System.out.println(s);
}
public static void main(String[] args) throws Exception {
    String fileName = "c:\\WINDOWS\\clock.avi";
    print("0 - " + new File(fileName).toString());
    print("1 - " + new File(fileName).toURI().toString());
    print("2 - " + new File(fileName).toURI().toURL().toString());
    print("3 - " + new URL(new File(fileName).toURI().toString()).toString());
}

结果:

 0 - c:\WINDOWS\clock.avi
 1 - file:/c:/WINDOWS/clock.avi
 2 - file:/c:/WINDOWS/clock.avi
 3 - file:/c:/WINDOWS/clock.avi

因此,No 1、2和3都是相同的,而且都不正确-正如我从URI规则推断的那样。它是Java错误吗?

是否有一种正确的方法可以从文件路径file:///c:/WINDOWS/clock.avi中准确获取c:\WINDOWS\clock.avi uri,而不是在各个地方都报告为错误的结果file:/c:/WINDOWS/clock.avi

StackOverflow最受欢迎的答案是使用No.1或No.2,但是上面显示结果不是正确的URI。

1 个答案:

答案 0 :(得分:1)

toUri()上调用Path会产生所需的URI。但是,我在文档中看不到任何说明这种行为的保证;或者如果它在文档中,我只是不认识它。因此,如果这种行为可能会发生变化,请注意,我仅使用 JDK 10.0.1 进行了尝试。

我认为,如果您可以切换代码以使用NIO2(Java 7)引入的文件API,而不是User_ID,那将是理想的选择。如果您出于某种原因而不愿意,则可以使用File.toPath()java.io转换为File(反之亦然,使用Path.toFile())。

使用此代码:

Path

给我这个输出:

File file = new File("C:\\Users\\Username\\Desktop");
System.out.printf("File.toURI() = %s%nFile.toPath().toUri() = %s%n", 
        file.toURI(), file.toPath().toUri());