大部分与文件相关的操作都不是在 Java 中执行的;存在本机代码来执行这些活动。实际上,完成的大部分工作取决于FileSystem 对象的性质(即支持File 对象)以及操作系统中本机IO 操作的底层实现。
为了清楚起见,我将介绍 OpenJDK 6 中的实现案例。 File.exists() 实现将实际检查推迟到 FileSystem 类:
public boolean exists() {
... calls to SecurityManager have been omitted for brevity ...
return ((fs.getBooleanAttributes(this) & FileSystem.BA_EXISTS) != 0);
}
FileSystem 类是抽象的,所有支持的文件系统都有一个实现:
package java.io;
/**
* Package-private abstract class for the local filesystem abstraction.
*/
abstract class FileSystem
注意包的私有性质。 Java 运行时环境将提供扩展 FileSystem 类的具体类。在 OpenJDK 实现中,有:
- java.io.WinNTFileSystem,用于 NTFS
- java.io.Win32FileSystem,用于 FAT32
- java.io.UnixFileSystem,用于 *nix 文件系统(这是一个职责非常广泛的类)。
以上所有类都委托给本机代码,用于getBooleanAttributes 方法。这意味着在这种情况下,性能不受托管(Java)代码的限制;文件系统的实现以及所进行的本机调用的性质对性能有更大的影响。
更新 #2
基于更新的问题 -
我不是在谈论网络和磁带系统。让我们把它保存到 ntfs、extX、zfs、jfs
好吧,那仍然没关系。不同的操作系统会以不同的方式实现对不同文件系统的支持。例如,Windows 中的 NTFS 支持将不同于 *nix 中的支持,因为除了通过驱动程序与设备通信外,操作系统还必须进行簿记。并非所有工作都在设备中完成。
在 Windows 中,您几乎总能找到 file system filter drivers 的概念,它管理与其他文件系统过滤器驱动程序或文件系统通信的任务。这是支持各种操作所必需的;一个例子是使用过滤器驱动来拦截 IO 调用。
在 *nix 中,您将拥有 stat() 系统调用,它将执行读取文件描述符的 inode 信息的必要活动。