Java:如何使用nio Path规范化路径?
关于java.io.File
一个非常好的事情是它可以将路径规范化为可预测的格式 。
new File("/", inputPath).getPath()
始终返回一个字符串,其相对路径已标准化,并始终以可预测的路径分隔符开头和结尾。
有没有办法用新的nio Path
或Paths
类做到这一点?
(另请注意,我正在处理其他系统的抽象路径,这与任何本地文件系统无关)
我想要的更多行为示例:
- "/foo" -> "/foo" - "//foo/" -> "/foo" - "foo/" -> "/foo" - "foo/bar" -> "/foo/bar" - "foo/bar/../baz" -> "/foo/baz" - "foo//bar" -> "/foo/bar"
此代码有效:
public final class Foo { private static final List 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 }