将URL转换为普通窗口文件名Java

2022-08-31 15:50:46

有没有办法转换这个:

/C:/Users/David/Dropbox/My%20Programs/Java/Test/bin/myJar.jar

进入这个?:

C:\Users\David\Dropbox\My Programs\Java\Test\bin\myJar.jar

我正在使用以下代码,它将返回.JAR 归档文件或 /bin 目录。

fullPath = new String(MainInterface.class.getProtectionDomain()
            .getCodeSource().getLocation().getPath());

问题是,返回一个,我需要一个普通的Windows文件名。我尝试在之后添加以下内容:getLocation()URLgetLocation()

toString()并且两者都返回:toExternalForm()

file:/C:/Users/David/Dropbox/My%20Programs/Java/Test/bin/

getPath()返回:

/C:/Users/David/Dropbox/My%20Programs/Java/Test/bin/

请注意,应将其转换为空间。%20

有没有一种快速简便的方法可以做到这一点?


答案 1

当前建议(使用 JDK 1.7+)是将 URL → URI 转换为→路径。因此,要将URL转换为文件,您会说.如果你还不能使用JDK 1.7,我会推荐。Paths.get(url.toURI()).toFile()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 字符都是用百分引号括起来的。
  • File.toURI() 比 Path.toUri() 更差,因为 File.toURI() 返回一个不寻常的非 RFC 1738 URI (给出 file:/而不是 file:///),并且不会根据 Microsoft 的首选格式格式化 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

同样,using 优于 ,因为 Path 能够处理 UNC URI 并拒绝带有 \?\ 前缀的无效路径。但是如果你不能使用Java 1.7,那就说吧。Paths.get(URI)new File(URI)new File(URI.getSchemeSpecificPart())

顺便说一句,不要用于解码文件URL。对于包含“+”(如“file:///C:/main.c++”)的文件,会将其转换为“C:\main.c”! 仅用于解析 URI 查询中的 application/x-www-form-urlencoded HTML 表单提交(),而不用于取消引用 URI 的路径。URLDecoderURLDecoderURLDecoderparam=value&param=value

2014-09:编辑以添加示例。


答案 2
String path = "/c:/foo%20bar/baz.jpg";
path = URLDecoder.decode(path, "utf-8");
path = new File(path).getPath();
System.out.println(path); // prints: c:\foo bar\baz.jpg