从java中的字符串路径规范化斜杠

时间:2013-05-06 16:14:12

标签: java

String path = "/var/lib/////xen//images///rhel";

斜杠的数量可以是任意数量。如何在java中规范化路径,如:

/var/lib/xen/images/rhel

4 个答案:

答案 0 :(得分:11)

使用内置String方法replaceAll和正则表达式"/+",用一个斜杠替换一个或多个斜杠:

path = path.replaceAll("/+", "/");

答案 1 :(得分:5)

您可以使用File对象输出特定于当前平台的路径:

String path = "/var/lib/////xen//images///rhel";
path = new File(path).getPath();

答案 2 :(得分:1)

使用GuavaCharMatcher

String simplifiedPath = CharMatcher.is('/').collapseFrom(originalPath, '/');

请参阅:Guava Explained > Strings > CharMatcher

答案 3 :(得分:1)

还有更多选择:

调用File#getCanonicalPath碰巧删除了斜杠,但它似乎在内部使用了这个堆栈:

at java.io.UnixFileSystem.canonicalize0(Native Method)
at java.io.UnixFileSystem.canonicalize(UnixFileSystem.java:172)
at java.io.File.getCanonicalPath(File.java:618)

这看起来实际上非常慢(至少在我们的特定系统上,下面是带有GPFS的Linux),所以我无法使用它。

接下来我尝试了,从Aubin删除的答案(谢谢!他说他可能在JDK某处看到过),这实际上要快得多:

path = new File( new File( path ).toURI().normalize()).getPath();

不幸的是,在toURI方法下面似乎称之为:

    at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
    at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:242)
    at java.io.File.isDirectory(File.java:843)
    at java.io.File.toURI(File.java:732)

再次有点放缓。

另见java nio Paths#normalize

所以在一天结束时,我最终使用了其他人的replaceAll方法。