Java:如何从转义的URL获取文件?

Syn*_*r0r 45 java url escaping file

我收到一个找到本地文件的URL(我收到的URL不在我的控制范围内).URL按RFC2396中的定义进行有效转义.如何将其转换为Java File对象?

有趣的是,URL getFile()方法返回一个String,而不是File.

我已经创建了一个名为"/ tmp/some dir"的目录(在"some"和"dir"之间有一个间距字符),它通过以下URL正确定位:"file:/// tmp/some%20dir" (为清楚起见,添加了引号).

如何将该URL转换为Java文件?

要提供有关我的问题的更多详细信息,以下打印为false:

URL url = new URL( "file:///tmp/some%20dir" );
File f = new File( url.getFile() );
System.out.println( "Does dir exist? " + f.exists() );
Run Code Online (Sandbox Code Playgroud)

而以下(用空格手动替换"%20")打印为true:

URL url = new URL( "file:///tmp/some%20dir" );
File f = new File( url.getFile().replaceAll( "%20", " " ) );
System.out.println( "Does dir exist? " + f.exists() );
Run Code Online (Sandbox Code Playgroud)

请注意,我不是在问为什么第一个示例打印为false,为什么使用我的hacky replaceAll的第二个示例打印为true,我问如何将转义的URL转换为Java File对象.

编辑:谢谢大家,这几乎是一个骗局但不完全.

愚蠢的是我在URL类本身中寻找一个帮助方法.

以下按预期从Java URL获取Java文件:

URL url = new URL( "file:///home/nonet/some%20dir" );
File f = new File( URLDecoder.decode( url.getFile(), "UTF-8" ) );
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 66

结合使用的File构造函数URIURL#toURI()应该工作:

URL url = getItSomehow();
File file = new File(url.toURI());
Run Code Online (Sandbox Code Playgroud)


Ces*_*sar 20

URLDecoder.decode(url);//deprecated
URLDecoder.decode(url, "UTF-8"); //use this instead
Run Code Online (Sandbox Code Playgroud)

请参阅相关问题如何在Java中浏览URL?

  • 如果URL是RFC2396编码的(例如它来自`file.toURI()`或`new URI("file",null,file.getPath(),null)`),那么**不要**解码它使用[URLDecoder](http://docs.oracle.com/javase/7/docs/api/java/net/URLDecoder.html)!例如,如果文件是"`main.c ++`",那么URLDecoder会将其解码为"`main.c`".URLDecoder仅用于解码HTML表单提交.这在[URL javadoc](http://docs.oracle.com/javase/7/docs/api/java/net/URL.html)的底部提到. (3认同)

vor*_*ger 6

像这样的AFAIK Paths.get(url.toURI()).toFile()是最好的,从Java 7开始.另请参见将Java file:// URL转换为File(...)路径,与平台无关,包括UNC路径.