有没有人知道我可以用来生成规范路径的任何Java库(基本上删除反向引用).
我需要做以下事情:
原始路径 - >规范路径
/../foo/ -> /foo
/foo/ -> /foo
/../../../ -> /
/./foo/./ -> /foo
//foo//bar -> /foo/bar
//foo/../bar -> /bar
Run Code Online (Sandbox Code Playgroud)
等等...
目前我懒洋洋地依赖于使用:
new File("/", path).getCanonicalPath();
Run Code Online (Sandbox Code Playgroud)
但是这解决了针对实际文件系统的路径,并且是同步的.
java.lang.Thread.State: BLOCKED (on object monitor)
at java.io.ExpiringCache.get(ExpiringCache.java:55)
- waiting to lock <0x93a0d180> (a java.io.ExpiringCache)
at java.io.UnixFileSystem.canonicalize(UnixFileSystem.java:137)
at java.io.File.getCanonicalPath(File.java:559)
Run Code Online (Sandbox Code Playgroud)
在我的文件系统中不存在我规范化的路径,因此只需该方法的逻辑就可以了,因此不需要任何同步.我希望有一个经过良好测试的库,而不是自己编写.
Ste*_*n C 21
我认为你可以使用URI类来做到这一点; 例如,如果路径中不包含需要在URI路径组件中转义的字符,则可以执行此操作.
String normalized = new URI(path).normalize().getPath();
Run Code Online (Sandbox Code Playgroud)
如果路径包含(或可能包含)需要转义的字符,则多参数构造函数将转义path参数,并且您可以提供null其他参数.
笔记:
上面通过将文件路径视为相对URI来规范化文件路径.如果要标准化整个URI ...包括(可选)方案,权限和其他组件,请不要调用getPath()!
URI规范化不涉及像文件规范化那样查看文件系统.但另一方面,当路径中存在符号链接时,规范化与规范化的行为不同.
tom*_*136 17
使用Apache Commons IO(一个着名且经过良好测试的库)
public static String normalize(String filename)
Run Code Online (Sandbox Code Playgroud)
会做你正在寻找的.
例:
String result = FilenameUtils.normalize(myFile.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)
小智 11
如果您不需要路径规范化而只需要规范化,那么在Java 7中您可以使用java.nio.file.Path.normalize方法.根据http://docs.oracle.com/javase/7/docs/api/java/nio/file/Path.html:
此方法不访问文件系统; 路径可能找不到存在的文件.
如果您使用File对象,您可以使用以下内容:
file.toPath().normalize().toFile()
Run Code Online (Sandbox Code Playgroud)