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

2022-08-31 23:56:31

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

有趣的是,URL getFile() 方法返回一个字符串,而不是一个 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() );

而以下内容(手动将“%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() );

请注意,我不是在问为什么第一个示例打印 false,也不是在问为什么第二个示例使用我的 hacky replaceAll print 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" ) );

答案 1

将 URI 与 URL#toURI() 结合使用的文件构造函数应该可以正常工作:

URL url = getItSomehow();
File file = new File(url.toURI());

答案 2
URLDecoder.decode(url);//deprecated
URLDecoder.decode(url, "UTF-8"); //use this instead

请参阅相关问题 如何在Java中取消对URL的扩展?