【发布时间】:2017-10-09 10:30:30
【问题描述】:
我只是想在这里用这个问题检查我自己的理智。我有一个文件名,其中包含 +(加号)字符,这在某些操作系统和文件系统(例如 MacOS 和 HFS+)上完全有效。
但是,我发现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,而是从磁盘读取文件目录,其中一些文件可能包含 +(加号)字符。
【问题讨论】:
-
如果我没看错你的问题,你希望
hello+world.txt显示为hello%2Bworld.txt