String path = "/var/lib/////xen//images///rhel";
斜线的数量可以是任意数量。如何规范化java中的路径,如:
/var/lib/xen/images/rhel
String path = "/var/lib/////xen//images///rhel";
斜线的数量可以是任意数量。如何规范化java中的路径,如:
/var/lib/xen/images/rhel
使用内置String
方法replaceAll
,使用正则表达式"/+"
,用一个斜杠替换一个或多个斜杠:
path = path.replaceAll("/+", "/");
您可以使用File
对象来输出特定于当前平台的路径:
String path = "/var/lib/////xen//images///rhel";
path = new File(path).getPath();
使用番石榴的CharMatcher
:
String simplifiedPath = CharMatcher.is('/').collapseFrom(originalPath, '/');
还有几个选择:
调用 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
了其他人的方法。