我只想用这个问题来检查我自己的理智。我有一个文件名,其中包含一个+ (加号)字符,它在某些操作系统和文件系统(例如MacOS和HFS+)上完全有效。
然而,我看到一个问题,我认为java.io.File#toURI()的操作不正确。
例如:
new File("hello+world.txt").toURI().toString()在我的Mac机器上返回:
file:/Users/aretter/code/rocksdb/hello+world.txt但是IMHO,这是不正确的,因为文件名中的+ (加号)字符没有在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+world.txt因此,在以后使用和解码时,加号将被保留。
我很难相信这样一个明显的错误可能存在于Java中。有人能指出我哪里弄错了吗?
另外,如果有解决办法,我想听听吗?请记住,我实际上并不是将静态字符串作为文件名提供给File,而是从磁盘读取文件目录,其中一些文件可能包含一个+ (加号)字符。
发布于 2017-10-09 10:32:24
尝试用反斜杠\转义加号,所以请这样做
new File("hello\+world.txt").toURI().toString()https://stackoverflow.com/questions/46644306
复制相似问题