生成规范路径

Joe*_*oel 22 java path

有没有人知道我可以用来生成规范路径的任何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其他参数.

笔记:

  1. 上面通过将文件路径视为相对URI来规范化文件路径.如果要标准化整个URI ...包括(可选)方案,权限和其他组件,请不要调用getPath()!

  2. 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)