生成规范路径

2022-09-01 20:14:42

有没有人知道我可以用来生成规范路径的任何Java库(基本上删除反向引用)。

我需要一些可以执行以下操作的东西:

原始路径 ->规范路径

/../foo/       -> /foo
/foo/          -> /foo
/../../../     -> /
/./foo/./      -> /foo
//foo//bar     -> /foo/bar
//foo/../bar   -> /bar

等。。。

目前,我懒惰地依靠使用:

 new File("/", path).getCanonicalPath();

但这解决了针对实际文件系统的路径,并且是同步的。

   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)

我正在规范化的路径在我的文件系统上不存在,因此只需该方法的逻辑就可以了,因此不需要任何同步。我希望有一个经过良好测试的库,而不必编写自己的库。


答案 1

我认为您可以使用URI类来执行此操作;例如,如果路径不包含需要在URI路径组件中转义的字符,则可以执行此操作。

String normalized = new URI(path).normalize().getPath();

如果路径包含(或可能包含)需要转义的字符,则多参数构造函数将转义该参数,并且您可以提供其他参数。pathnull

笔记:

  1. 上述方法通过将文件路径视为相对 URI 来规范化文件路径。如果要规范化整个 URI...包括(可选)方案、权限等组件,请勿调用!getPath()

  2. URI 规范化不像文件规范化那样涉及查看文件系统。但另一方面,当路径中存在符号链接时,规范化的行为与规范化的行为不同。


答案 2

使用Apache Commons IO(一个众所周知且经过充分测试的库)

public static String normalize(String filename)

将完全按照您的要求去做。

例:

String result = FilenameUtils.normalize(myFile.getAbsolutePath());

推荐