将URL转换为普通的Windows文件名Java [英] Convert URL to normal windows filename 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规范是 RFC 1738:URL ,由 RFC 2396:URI 取代,由RFC 3986:URI 。 (WHATWG还有一个 URI规范,但没有说明应该如何解释文件URI。)当调用URI.toASCIIString()时,路径是百分比引用,URI中的非ascii字符是百分比引用。
- File.toURI()比Path.toUri更糟糕( )因为File.toURI()返回一个不寻常的非RFC 1738 URI (给出文件:/而不是file:///)并且不根据微软的首选格式。这些UNC URI都不适用于Firefox(Firefox需要文件://///)。
- 路径比文件更严格;您无法从\。\\构建无效路径\\前缀。 这些前缀不会用作路径本身的一部分,但它们可以传递给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)
优先于新文件(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¶m=value
), not for unquoting a URI’s path.
2014-09: edited to add examples.
这篇关于将URL转换为普通的Windows文件名Java的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!