我只想在这里检查一下我自己的理智。我有一个文件名,其中有一个+
(加号)字符,这在一些操作系统和文件系统(例如MacOS和HFS +)上是完全有效的。File.toURI不对加号进行编码
但是,我看到一个问题,我认为java.io.File#toURI()
运行不正常。
例如:
new File("hello+world.txt").toURI().toString()
在我的Mac机返回:
file:/Users/aretter/code/rocksdb/hello+world.txt
但是恕我直言,这是不正确的,因为从文件名+
(加)字符尚未在编码URI。该URI根本不代表原始文件名,URI中的+
与文件名中的+
字符具有非常不同的含义。
所以,如果我们解码的URI,加号现在将被替换为(空格)字符,我们已经失去了信息。例如:
URLDecoder.decode(new File("hello+world.txt").toURI().toURL().toString)
导致:
file:/Users/aretter/code/rocksdb/hello world.txt
我本来期望反而会是这样的:
new File("hello+world.txt").toURI().toString()
导致:
file:/Users/aretter/code/rocksdb/hello%2Bworld.txt
使当它在后来被使用和dec时oded加号被保留。
我很难相信这样一个明显的bug可能出现在Java SE中。有人能指出我错在哪里吗?
此外,如果有解决方法,我想听一听吗?请记住,我实际上不是将静态字符串作为文件名提供给File,而是从磁盘读取文件的目录,其中某些文件可能包含+
(加号)字符。
如果我正确地得到你的问题,你想'你好+ world.txt'到显示为'hello%2Bworld.txt' – Ravi