Java:如何使用nio Path规范化路径?

10

java.io.File中非常好的一件事情是它可以将路径规范化可预测的格式

new File("/", inputPath).getPath()总是返回一个字符串,其中相对路径已被规范化,并始终以可预测的路径分隔符开头和结尾。

使用新的nio PathPaths类是否有方法可以做到这一点?

(请注意,我正在处理其他系统的抽象路径,这与任何本地文件系统无关)

进一步的示例行为:

 - "/foo" -> "/foo"
 - "//foo/" -> "/foo"
 - "foo/" -> "/foo"
 - "foo/bar" -> "/foo/bar"
 - "foo/bar/../baz" -> "/foo/baz"
 - "foo//bar" -> "/foo/bar"

我想使用nio API的原因是它有一些很好的附加功能,比如Paths.get()(比new File()更简洁)和Path.subpath()。我只是想将它们与使用new File("/", input)时获得的现有简单性混合在一起。 - TREE
我还想在这个宇宙中留下一条评论,即java.io.FileSystem和java.nio.file.FileSystem同时存在非常令人困惑。 - TREE
请查看我的回答编辑(我不知道你在哪里看到了java.io.FileSystem)。 - fge
java.io.File 使用 java.io.Filesystem。它具有本地默认 FileSystem 的概念。 - TREE
一个相关的问题,这也是我想使用java.nio的原因之一:https://stackoverflow.com/questions/28058287/concise-ways-to-split-paths-using-java-nio - TREE
1个回答

15

这段代码有效:

public final class Foo
{
    private static final List<String> INPUTS = Arrays.asList(
        "/foo", "//foo", "foo/", "foo/bar", "foo/bar/../baz", "foo//bar"
    );

    public static void main(final String... args)
    {
        Path path;

        for (final String input: INPUTS) {
            path = Paths.get("/", input).normalize();
            System.out.printf("%s -> %s\n", input, path);
        }
    }
}

输出:

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

请注意,这不是可移植的。它无法在Windows机器上工作...

如果您需要一个可移植的解决方案,可以使用memoryfilesystem,打开Unix文件系统并使用它:

try (
    final FileSystem fs = MemoryFileSystem.newLinux().build();
) {
    // path operations here
}

toAbsolutePath() 函数似乎会在任何不以路径分隔符开头的情况下,将 Java 进程的工作目录作为前缀(这不是我要找的... 我根本没有处理本地文件系统)。toRealPath() 函数尝试实际上去查找本地文件系统上的路径。 - TREE
如果您没有处理本地文件系统,这意味着您不使用Paths.get()来检索路径,对吗? - fge
好的,我不太确定你想做什么,但是尝试一下规范化Paths.get("/", "yourpathhere")的结果。那应该可以解决问题。 - fge
@Tree:我认为前导路径分隔符应该是构建“Path”的一部分,而不是在输出中格式化它,正如@fge之前的建议所述? - Louis Wasserman
1
@TREE: 我的意思是,如果它们没有以一致的格式出现,那么我认为这是因为您没有以一致的格式输入它们。如果您规范化foo/bar/../foo/bar/..,那么您应该会得到不同的结果。如果您在问题中发布您正在使用的确切代码、提供的输入和获取的输出,那么我们可以建议您如何修复它们。 - Louis Wasserman
显示剩余13条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接