如何在 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/
在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/