当前位置: 首页 > 面试题库 >

将URL转换为普通的Windows文件名Java

柴嘉禧
2023-03-14
问题内容

有没有一种方法可以将其转换为:

/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()返回a 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→路径。因此,要将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&param=value)中的application /
x-www-form-urlencoded HTML表单提交,而不用于取消引用URI的路径。

2014-09:编辑添加示例。



 类似资料:
  • 问题内容: 我的页面会生成这样的URL:如何将其转换为普通地址? 我将其用作的属性。 问题答案: 从JavaScript创建的URL 不能转换为“普通” URL。 一个URL并不是指在服务器上存在的数据,它是指数据您的浏览器目前在存储器中,当前页面。它在其他页面上将不可用,在其他浏览器中将不可用,并且在其他计算机上将不可用。 因此,通常来说,将URL 转换为“正常” URL 是没有意义的。如果要使

  • 问题内容: 在WeasyPrint的公共API中,我接受HTML输入的文件名(除其他类型外)。任何与内置文件一起使用的文件名都可以使用,但是我需要将其转换为方案中的URL,然后再将其传递给。 (所有内容在内部都是URL形式。我需要为文档提供一个“基本URL”,以便使用来解析相对URL引用。) urllib.pathname2url是一个开始: 将路径名路径从路径的本地语法转换为URL的路径组件中使

  • 问题内容: 在Java中,是否存在在URL和Windows文件名之间转换的标准/良好方法? 我正在尝试下载文件,但是我希望Windows文件名可以转换回原始文件名。请注意,URL的查询部分至关重要,因为我将下载仅在查询方面有所不同的不同页面。 我当前的hacky解决方案是用特定的字符串(例如“ QQ”)替换非法字符(例如“?”),但这会使转换回url的透明度降低。有没有更好的办法? 问题答案: 您

  • 问题内容: 有没有一种方法可以将JSON数组转换为用于Java ListView数据绑定的普通Java数组? 问题答案:

  • 问题内容: 我有一个猫鼬的文档,我想在JSON编码之前进行扩展并作为响应发送出去。如果我尝试向文档添加属性,则将其忽略。该属性不会出现无法进行正常扩展的情况。奇怪的是,它可以正常工作并返回具有所有正确属性的对象。有一个更好的方法吗? 问题答案: 猫鼬继承自s,后者有一个方法。我相信您要寻找的应该是的结果。 http://mongoosejs.com/docs/api.html#document_D

  • 我需要将这个sql查询转换为hibernate条件,请大家帮忙。 按名称顺序按应用描述限制3从设备组中选择名称,计数(*)为应用