Большинство операций с файлами не выполняются в Java; для выполнения этих действий существует собственный код. В действительности большая часть выполняемой работы зависит от природы объекта FileSystem
(который поддерживает объект File
) и базовой реализации собственных операций ввода-вывода в ОС.
Для ясности я приведу пример реализации в 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
Ну, это все равно не имеет значения. Разные операционные системы будут реализовывать поддержку разных файловых систем по-разному. Например, поддержка NTFS в Windows будет отличаться от поддержки в * nix, потому что операционная система также должна будет нести свою долю бухгалтерии, помимо связи с устройствами через их драйверы; не вся работа выполняется в устройстве.
В Windows вы почти всегда найдете концепцию драйверов фильтра файловой системы , которая управляет задачей связи с другими драйверами фильтра файловой системы или файловой системой. Это необходимо для поддержки различных операций; В качестве примера можно привести использование драйверов фильтров для антивирусных ядер и другого программного обеспечения (продуктов шифрования и сжатия на лету), перехватывающих вызовы ввода-вывода.
В * nix у вас будет stat () , системный вызов, который выполнит необходимую операцию чтения информации inode для дескриптора файла.