String path = "/var/lib/////xen//images///rhel";
斜杠的数量可以是任意数量。如何在java中规范化路径,如:
/var/lib/xen/images/rhel
答案 0 :(得分:11)
使用内置String
方法replaceAll
和正则表达式"/+"
,用一个斜杠替换一个或多个斜杠:
path = path.replaceAll("/+", "/");
答案 1 :(得分:5)
您可以使用File
对象输出特定于当前平台的路径:
String path = "/var/lib/////xen//images///rhel";
path = new File(path).getPath();
答案 2 :(得分:1)
使用Guava的CharMatcher
:
String simplifiedPath = CharMatcher.is('/').collapseFrom(originalPath, '/');
答案 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
方法。