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

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

/var/lib/xen/images/rhel
4

4 回答 4

14

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

path = path.replaceAll("/+", "/");
于 2013-05-06T16:17:13.383 回答
5

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

String path = "/var/lib/////xen//images///rhel";
path = new File(path).getPath();
于 2013-05-06T16:21:37.603 回答
2

使用番石榴CharMatcher

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

请参阅:番石榴解释 > 字符串 > CharMatcher

于 2013-05-06T16:38:01.983 回答
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路径#normalize

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

于 2016-04-14T23:51:42.307 回答