将URL转换为普通的Windows文件名Java [英] Convert URL to normal windows filename Java

查看:478
本文介绍了将URL转换为普通的Windows文件名Java的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法转换它:

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

进入这个?:



'pre> 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()都返回:

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

getPath()返回:

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

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



有没有快速简便的方法呢?

解决方案

目前的建议(JDK 1.7+)是转换URL→URI→路径。因此,要将URL转换为File,您可以说 Paths.get(url.toURI())。toFile()。如果您无法使用JDK 1.7的是,我会建议新文件(URI.getSchemeSpecificPart())



转换文件→URI:首先,我将向您展示一些您可能在Java中获得的URI的示例。

   - classpath URLClassLoader File.toURI()Path.toUri()
C:\Program Files file:/ C:/ Program%20Files / file:/ C:/ Program%20Files / file:/// C:/节目%20Files /
C:\main.c ++文件:/ C:/main.c++文件:/ C:/main.c++文件:/// C:/main.c++
\ \ VBOXSVR \D下载文件:// VBOXSVR / Downloads / file://// VBOXSVR / Downloads / file:// VBOXSVR / Downloads /
C:\Résume.txt文件:/ C:/ R %C3%a9sume.txt文件:/ C:/Résume.txt文件:/// C:/Résume.txt
\\ \C:\Windows(非路径)的文件:/ /%3f / C:/ Windows / file:////%3F / C:/ Windows / InvalidPathException

关于th的一些观察ese URI:





转换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)优先于新文件(URI),因为Path能够处理UNC URI并拒绝带有\?\前缀的无效路径。但是如果你不能使用Java 1.7,那就说新文件(URI.getSchemeSpecificPart())



顺便说一下,使用 URLDecoder 来解码文件URL。对于包含文件+,如文件:/// C:/main.c++, URLDecoder 将它变成C:\main.c &NBSP ;! URLDecoder 仅用于解析URI查询中的application / x-www-form-urlencoded HTML表单提交( param = value& param = value ),不用于取消引用URI的路径。



2014-09:编辑添加示例。


Is there a way to convert this:

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

into this?:

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

I am using the following code, which will return the full path of the .JAR archive, or the /bin directory.

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

The problem is, getLocation() returns a URL and I need a normal windows filename. I have tried adding the following after getLocation():

toString() and toExternalForm() both return:

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

getPath() returns:

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

Note the %20 which should be converted to space.

Is there a quick and easy way of doing this?

解决方案

The current recommendation (with JDK 1.7+) is to convert URL → URI → Path. So to convert a URL to File, you would say Paths.get(url.toURI()).toFile(). If you can’t use JDK 1.7 yet, I would recommend new File(URI.getSchemeSpecificPart()).

Converting file → URI: First I’ll show you some examples of what URIs you are likely to get in Java.

                          -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

Some observations about these URIs:

  • The URI specifications are RFC 1738: URL, superseded by RFC 2396: URI, superseded by RFC 3986: URI. (The WHATWG also has a URI spec, but it does not specify how file URIs should be interpreted.) Any reserved characters within the path are percent-quoted, and non-ascii characters in a URI are percent-quoted when you call URI.toASCIIString().
  • File.toURI() is worse than Path.toUri() because File.toURI() returns an unusual non-RFC 1738 URI (gives file:/ instead of file:///) and does not format URIs for UNC paths according to Microsoft’s preferred format. None of these UNC URIs work in Firefox though (Firefox requires file://///).
  • Path is more strict than File; you cannot construct an invalid Path from "\.\" prefix. "These prefixes are not used as part of the path itself," but they can be passed to Win32 APIs.

Converting URI → file: Let’s try converting the preceding examples to files:

                            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

Again, using Paths.get(URI) is preferred over new File(URI), because Path is able to handle the UNC URI and reject invalid paths with the \?\ prefix. But if you can’t use Java 1.7, say new File(URI.getSchemeSpecificPart()) instead.

By the way, do not use URLDecoder to decode a file URL. For files containing "+" such as "file:///C:/main.c++", URLDecoder will turn it into "C:\main.c  "! URLDecoder is only for parsing application/x-www-form-urlencoded HTML form submissions within a URI’s query (param=value&param=value), not for unquoting a URI’s path.

2014-09: edited to add examples.

这篇关于将URL转换为普通的Windows文件名Java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆