Paths.get()...换句话说,如果你沿着小道走,你会迷路

时间:2013-05-19 18:36:36

标签: java interface path abstract

在我的代码中,我有这个指示:

Path p1 = Paths.get("c:\\java\\");

作为Path只是一个界面,我想知道get()在里面做了什么。所以我在Path.class中打开了源代码,这是我找到的:

public static Path get(String first, String... more) {
    return FileSystems.getDefault().getPath(first, more);
}

如您所见,有一个返回Path的getPath()。所以我打开FileSystem.class来查看getPath,这是我这次发现的...抽象方法:

public abstract Path getPath(String first, String... more);

怎么可能?这段代码似乎什么都不做,而且还有一种抽象方法,所以我无法看到它是如何运行的。有人可以澄清一下吗?

2 个答案:

答案 0 :(得分:2)

当你调用FileSystems.getDefault()时,你获得了一个FileSystem(依赖于操作系统)的实现,它有自己的getPath实现,返回它自己的Path接口实现。

答案 1 :(得分:0)

首先,你看错了地方进行实施。您查看了getPath课程的FileSystem。请注意,FileSystem本身是一个抽象类,其中getPath被声明为抽象方法,正如您所注意到的那样。这是因为,必须有一个文件系统提供程序,它通过扩展FileSystem类来实现它的特定机制。例如,当您尝试在Unix或Windows上访问文件系统时,会有一个默认的文件系统提供程序来处理您的所有请求,如文件创建,目录/文件夹列表等...默认文件系统管理HDD上的文件。同样,可能有另一个文件系统可能管理内存中的文件,如Google's Jimfs

其次,当get的{​​{1}}方法通过调用Paths返回Path对象时,您应该首先深入研究FileSystems.getDefault() getDefault方法}}。这将导致您进入默认文件系统提供程序。如上所述,Unix和Windows等操作系统具有默认文件系统提供程序,并且是相应JDK / JRE的一部分。例如,Oracle的JDK有一个默认值。