URI.resolve() 不支持所有允许的文件名字符

URI.resolve() does not support the full spectrum of allowed file name characters

我曾经使用 URI 元素来表示基本文件夹,并使用 URI.resolve(文件名) 获取我想写入磁盘的实际文件的 URI。

现在我发现,由于明显的原因,解析方法不支持许多 OS 支持的文件名字符,这些字符必须使用 %HEX 进行编码。

因为我不知道这个限制,也不知道编码到底有多远。这通常用在参数值中,我几乎想不出在路径中看到编码的情况。

那么是否可以假设使用 URI.resolve(URLEncoder.encode(filename)) 可以解决问题?有没有我应该知道的更好的替代方案或极端情况?

实际上是 URI.create(en) 失败了,例如使用“!@#$%^&()”(如果文件名非常奇怪,这是有效的)抛出 IllegalArgumentException: Malformed escape pair at index 4
至于 URLEncoder.encode(filename) - 它已被弃用,应改用 URLEncoder.encode(filename, encoding)
根据我的经验,文件名 URI 解析最好由 new File(f).toURI() 处理,对于给定的抽象路径名 f,可以保证:

new File(f.toURI()).equals( f.getAbsoluteFile())