确定“.”和“…”是否为“;“特殊名称”;在Java文件系统中

确定“.”和“…”是否为“;“特殊名称”;在Java文件系统中,java,filesystems,filenames,Java,Filesystems,Filenames,我习惯于认为和。总是具有特殊含义的文件名。但一些Java 11 API(如)表明,这仅适用于某些文件系统实现: 在许多文件系统中,“.”和“.”是用于指示当前目录和父目录的特殊名称 如果和。仅在某些文件系统上是“特殊名称”,我如何查询文件系统以了解这些名称是否是该实现的特殊名称?没有规范要求文件系统实现提供此信息 因此,即使某些文件系统会向您提供此信息,您也无法确定您是否正在处理一个不提供此信息的文件系统 如果您真的关心这些信息,并且需要这些信息才能使代码正常工作,那么您唯一的选择就是做一些类似

我习惯于认为
总是具有特殊含义的文件名。但一些Java 11 API(如)表明,这仅适用于某些文件系统实现:

在许多文件系统中,“.”和“.”是用于指示当前目录和父目录的特殊名称


如果
仅在某些文件系统上是“特殊名称”,我如何查询文件系统以了解这些名称是否是该实现的特殊名称?

没有规范要求
文件系统
实现提供此信息

因此,即使某些
文件系统
会向您提供此信息,您也无法确定您是否正在处理一个不提供此信息的文件系统

如果您真的关心这些信息,并且需要这些信息才能使代码正常工作,那么您唯一的选择就是做一些类似的事情

Map<String, Object> env = new HashMap<>();
FileSystem f = FileSystems.newFileSystem(new URI("rw:///"), env);

boolean equalsDoesntNormalize = !f.getPath("a/./b").equals(f.getPath("a/b"));
boolean equalAfterNormalize = f.getPath("a/./b").normalize().equals(f.getPath("a/b"));
boolean dotIsSpecial = equalAfterNormalize && !equalsDoesntNormalize;
Map env=new HashMap();
FileSystem f=FileSystems.newFileSystem(新URI(“rw://”),env);
布尔等式doesnormalize=!f、 getPath(“a//b”)。等于(f.getPath(“a/b”);
布尔equalAfterNormalize=f.getPath(“a//b”).normalize().equals(f.getPath(“a/b”);
boolean dotIsSpecial=equalAfterNormalize&!等式不规范化;

但是,老实说:我认为您不需要这些信息……

如果您在大型机或虚拟机上运行,您可能知道它。您可能必须对
System.getProperty(“os.name”)
执行一些hokey操作-这是一个非常不寻常的“特殊情况”(至少我认为是这样)。这是一个巨大的假设,即我会自动知道我在大型机上运行,或者我甚至知道检查甚至关心我是否在大型机上运行。新Java和相关类的全部目的是消除对这些特殊操作系统检查的需要。这就是为什么我们应该使用
Path.resolve()。不过,如果API允许它们不是特殊名称,我需要知道如何判断它们是否是特殊名称。Java运行在不寻常的系统上,甚至没有文件系统。请注意,这只是一个评论,我没有答案给你。我很高兴你从1998年的产品中抽出一个参考资料D啊,那时我们对Java的梦想。