Java: 如何使用 nio Path 规范化路径?
Java: how to normalize paths with nio Path?
java.io.File
的一大优点是它可以将路径规范化为可预测的格式。
new File("/", inputPath).getPath()
始终 returns 相对路径标准化的字符串,并且始终以可预测的路径分隔符开始和结束。
有没有办法用新的 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<String> 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
}
java.io.File
的一大优点是它可以将路径规范化为可预测的格式。
new File("/", inputPath).getPath()
始终 returns 相对路径标准化的字符串,并且始终以可预测的路径分隔符开始和结束。
有没有办法用新的 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<String> 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
}