在Wikipedia中,它说:
以下是一些示例,它们可以被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。
答案 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());