gpt4 book ai didi

java - 将 URL 转换为普通的 windows 文件名 Java

转载 作者:IT老高 更新时间:2023-10-28 20:28:53 25 4
gpt4 key购买 nike

有没有办法转换这个:

/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());

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

toString()toExternalForm() 都返回:

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

getPath() 返回:

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

注意 %20 应该转换为空格。

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

最佳答案

目前的建议(JDK 1.7+)是转换 URL → URI → Path。因此,要将 URL 转换为文件,您会说 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 spec ,但它没有指定文件 URI 应该如何解释。)路径中的任何保留字符都用百分号引号括起来,而 URI 中的非 ascii 字符在调用 URI 时用百分号引号括起来.toASCIIString()。
  • File.toURI() 比 Path.toUri() 差,因为 File.toURI() returns an unusual non-RFC 1738 URI (给出 file:/而不是 file:///)并且不根据 Microsoft’s preferred format 格式化 UNC 路径的 URI .但是,这些 UNC URI 在 Firefox 中都不起作用(Firefox 需要 file://///)。
  • 路径比文件更严格;您不能从 “\.\” prefix 构造无效路径. “这些前缀不用作路径本身的一部分”,但它们可以传递给 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&param=value) 中的 application/x-www-form-urlencoded HTML 表单提交,而不用于取消引用 URI 的路径。

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

关于java - 将 URL 转换为普通的 windows 文件名 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6164448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com