当前的建议(使用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++\VBOXSVRDownloads 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 Filesfile:/C:/Program%20Files C:Program Files C:Program Files C:Program Filesfile:///C:/main.c++ C:main.c++ C:main.c++ C:main.c++file://VBOXSVR/Downloads/ IllegalArgumentException \VBOXSVRDownloads \VBOXSVRDownloadsfile:////VBOXSVR/Downloads/ \VBOXSVRDownloads \VBOXSVRDownloads \VBOXSVRDownloadsfile://///VBOXSVR/Downloads \VBOXSVRDownloads \VBOXSVRDownloads \VBOXSVRDownloadsfile://%3f/C:/Windows/ IllegalArgumentException IllegalArgumentException \?C:Windowsfile:////%3F/C:/Windows/ \?C:WindowsInvalidPathException \?C:Windows
同样,使用
Paths.get(URI)优先于
new File(URI),因为Path能够处理UNC
URI并拒绝带有?前缀的无效路径。但是,如果您不能使用Java 1.7,请
newFile(URI.getSchemeSpecificPart())改为说。
顺便说一句,千万 不能 用
URLDeprer解码文件URL。对于包含“ +”的文件,例如“ file:/// C:/main.c++”,
URLDeprer请将其转换为“ C:
main.c”!
URLDeprer仅用于解析URI的查询(
param=value¶m=value)中的application /
x-www-form-urlenpred HTML表单提交,而不用于取消引用URI的路径。
2014-09:编辑添加示例。



