如何在 Java、Windows 中获得正确的 URI

How can I get a proper URI in Java, Windows

Wikipedia中说:

Windows

Here are some examples which may be accepted by some applications on Windows systems, referring to the same, local file c:\WINDOWS\clock.avi

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

Here is the URI as understood by the Windows Shell API:[2]

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

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

该应用会根据 link(运行 pdf、互联网、音乐等)

拦截对 link 的点击,分析并执行操作

但是,我没能从文件名中生成正确的 URI,以便在这些 Web 视图页面中使用。

这些是 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

因此,第 1、2 和 3 号都是相同的,其中 none 个是正确的 - 正如我从 URI 规则推断的那样。是 Java 错误吗?

是否有正确的方法从文件路径 c:\WINDOWS\clock.avi 中准确获取 file:///c:/WINDOWS/clock.avi uri 而不是结果 file:/c:/WINDOWS/clock.avi,后者在多个地方被报告为错误?

Whosebug 最流行的答案是使用 1 号或 2 号,但上面显示结果不是正确的 URI。

调用 toUri() on a Path 会产生您想要的 URI。但是,我在文档中没有看到任何说明这是有保证的行为的内容;或者如果它在文档中,我只是不认识它。因此,如果此行为可能会发生变化,请注意我仅使用 JDK 10.0.1.

进行了尝试

在我看来,如果您可以将代码切换为使用随 NIO2 (Java 7) 引入的文件 API,而不是 java.io,那将是理想的。如果您出于某种原因不能或不想这样做,那么您可以使用 File.toPath() (and vice versa using Path.toFile()).

File 转换为 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());

给我这个输出:

File.toURI() = file:/C:/Users/Username/Desktop/
File.toPath().toUri() = file:///C:/Users/Username/Desktop/