我只是想通过这个问题来确认自己的理智。我有一个文件名中包含一个“+”(加号)字符,这在一些操作系统和文件系统上是完全有效的(例如MacOS和HFS +)。
然而,我发现
例如:
然而在我看来,这是不正确的,因为文件名中的“+”(加号)字符并没有在URI中进行编码。URI根本不代表原始文件名,“+”在URI中具有非常不同的含义,与文件名中的“+”字符截然不同。
因此,如果我们解码URI,加号将被替换为空格字符,并且我们丢失了信息。例如:
这会导致:
我原本期望的是这样的内容:
导致:
然而,我发现
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
这样当它稍后被使用和解码时,加号会被保留。
我很难相信Java SE中会存在这样一个明显的漏洞。有人能指出我哪里错了吗?
另外,如果有解决方法,我想听听。请记住,我实际上并没有将静态字符串作为文件名提供给File,而是从磁盘读取文件目录,其中一些文件可能包含“+”(加号)字符。