小编典典
当前的建议(使用JDK
1.7+)是转换URL→URI→路径。因此,要将URL转换为File,您应该说Paths.get(url.toURI()).toFile()。如果您还不能使用JDK
1.7,我建议您使用new File(URI.getSchemeSpecificPart())。
转换文件→URI:首先,我将向您展示一些可能在Java中获得的URI的示例。
-classpath URLClassLoader File.toURI() Path.toUri()
C:\Program Files file:/C:/Program%20Files/ file:/C:/Program%20Files/ file:///C:/Program%20Files/
C:\main.c++ file:/C:/main.c++ file:/C:/main.c++ file:///C:/main.c++
\\VBOXSVR\Downloads file://VBOXSVR/Downloads/ file:VBOXSVR/Downloads/ file://VBOXSVR/Downloads/
C:\Résume.txt file:/C:/R%c3%a9sume.txt file:/C:/Résume.txt file:///C:/Résume.txt
\\?\C:\Windows (non-path) file://%3f/C:/Windows/ file:%3F/C:/Windows/ InvalidPathException
关于这些URI的一些观察:
URI规范为 RFC 1738:URL,由RFC 2396:URI取代,并由RFC 3986:URI取代。(WHATWG也具有URI规范,但未指定文件URI的解释方式。)调用URI时,路径中的任何保留字符都用百分号引起来,而URI中的非ASCII字符则用百分号引起来。 toASCIIString()。
File.toURI()比Path.toUri()更糟糕,因为File.toURI()返回不寻常的非RFC 1738 URI(提供file:/而不是file:///),并且不会根据UNC路径格式化URI 微软的首选格式。但是,这些UNC URI都不在Firefox中起作用(Firefox需要file:/)。
路径比文件更严格;您不能从“ \。\”前缀构造无效的路径。“这些前缀不用作路径本身的一部分,”但可以将它们传递给Win32 API。
转换URI→文件:让我们尝试将前面的示例转换为文件:
new File(URI) Paths.get(URI) new File(URI.getSchemeSpecificPart())
file:///C:/Program%20Files C:\Program Files C:\Program Files C:\Program Files
file:/C:/Program%20Files C:\Program Files C:\Program Files C:\Program Files
file:///C:/main.c++ C:\main.c++ C:\main.c++ C:\main.c++
file://VBOXSVR/Downloads/ IllegalArgumentException \\VBOXSVR\Downloads\ \\VBOXSVR\Downloads
file:VBOXSVR/Downloads/ \\VBOXSVR\Downloads \\VBOXSVR\Downloads\ \\VBOXSVR\Downloads
file:/VBOXSVR/Downloads \\VBOXSVR\Downloads \\VBOXSVR\Downloads\ \\VBOXSVR\Downloads
file://%3f/C:/Windows/ IllegalArgumentException IllegalArgumentException \\?\C:\Windows
file:%3F/C:/Windows/ \\?\C:\Windows InvalidPathException \\?\C:\Windows
同样,使用Paths.get(URI)优先于new File(URI),因为Path能够处理UNC
URI并拒绝带有\?\前缀的无效路径。但是,如果您不能使用Java 1.7,请new
File(URI.getSchemeSpecificPart())改为说。
顺便说一句,千万 不能 用URLDecoder解码文件URL。对于包含“ +”的文件,例如“ file:/// C:/main.c++”,
URLDecoder请将其转换为“ C:\
main.c”!URLDecoder仅用于解析URI的查询(param=value¶m=value)中的application /
x-www-form-urlencoded HTML表单提交,而不用于取消引用URI的路径。
2014-09:编辑添加示例。
2020-09-23