vacio - no existe en java
Qué tan caro es File.exists en Java (3)
Me pregunto cómo funciona File.exists()
. No soy muy consciente de cómo funcionan los sistemas de archivos, así que tal vez debería empezar a leer allí primero.
Pero para una preinformación rápida:
¿Es una llamada a File.exists()
una acción única para el sistema de archivos, si esa ruta y el nombre de archivo están registrados en alguna revista? ¿O el sistema operativo obtiene el contenido del directorio y luego examina las coincidencias?
Supongo que esto dependerá del sistema de archivos, pero ¿quizás todos los sistemas de archivos usan el enfoque rápido?
No estoy hablando de redes y sistemas de cintas. Permite mantenerlo en ntfs, extX, zfs, jfs :-)
Cómo esta operación, si se realiza por primera vez, depende por completo del sistema de archivos. Esto es hecho por el SO y Java no juega ninguna parte.
En términos de rendimiento, se requiere una lectura en un disco en todos los casos. Esto generalmente toma 8-12 ms. @Sven señala que el almacenamiento podría ser más lento, pero esto es relativamente raro en los casos en que el rendimiento es importante. Es posible que tenga un retraso adicional si se trata de un sistema de archivos de red (generalmente relativamente pequeño, pero depende de la latencia de la red).
Todo lo demás que hace el sistema operativo y Java es muy corto en comparación.
Sin embargo, si comprueba que el archivo existe en varias ocasiones, es posible que no se requiera acceso a un Disco, ya que la información puede almacenarse en caché, en este caso, el tiempo que tarda el sistema operativo y los recursos. Uno de los más grandes de estos objetos crea File.exists () (no lo pensaría) pero codifica el nombre del archivo en cada llamada creando muchos objetos. Si coloca File.exists () en un bucle cerrado, puede crear 400 MB de basura por segundo. :(
Los sistemas de archivos en diario funcionan de manera diferente haciendo un seguimiento de todos los cambios que realiza en un sistema de archivos, sin embargo, no cambian la forma en que lee el sistema de archivos.
La mayoría de las operaciones relacionadas con archivos no se realizan en Java; código nativo existe para realizar estas actividades. En realidad, la mayor parte del trabajo realizado depende de la naturaleza del objeto FileSystem
(que respalda el objeto File
) y la implementación subyacente de las operaciones IO nativas en el sistema operativo.
Presentaré el caso de la implementación en OpenJDK 6, para mayor claridad. La implementación File.exists () difiere las comprobaciones reales a la clase FileSystem:
public boolean exists() {
... calls to SecurityManager have been omitted for brevity ...
return ((fs.getBooleanAttributes(this) & FileSystem.BA_EXISTS) != 0);
}
La clase FileSystem es abstracta, y existe una implementación para todos los sistemas de archivos compatibles:
package java.io;
/**
* Package-private abstract class for the local filesystem abstraction.
*/
abstract class FileSystem
Observe la naturaleza privada del paquete. Un Java Runtime Environment proporcionará clases concretas que amplíen la clase FileSystem. En la implementación OpenJDK, hay:
- java.io.WinNTFileSystem, para NTFS
- java.io.Win32FileSystem, para FAT32
- java.io.UnixFileSystem, para sistemas de archivos * nix (esta es una clase con una responsabilidad muy amplia).
Todas las clases anteriores delegan en código nativo, para el método getBooleanAttributes
. Esto implica que el rendimiento no está limitado por el código administrado (Java) en este caso; la implementación del sistema de archivos y la naturaleza de las llamadas nativas que se realizan tienen una mayor relación con el rendimiento.
Actualización # 2
Basado en la pregunta actualizada -
No estoy hablando de redes y sistemas de cintas. Permite mantenerlo en ntfs, extX, zfs, jfs
Bueno, eso todavía no importa. Los diferentes sistemas operativos implementarán soporte para diferentes sistemas de archivos de diferentes maneras. Por ejemplo, la compatibilidad NTFS en Windows será diferente a la de * nix, porque el sistema operativo también tendrá que compartir su contabilidad, además de comunicarse con los dispositivos a través de sus controladores; no todo el trabajo se hace en el dispositivo.
En Windows, casi siempre encontrará el concepto de un controlador de filtro de sistema de archivos que gestiona la tarea de comunicarse con otros controladores de filtro del sistema de archivos o el sistema de archivos. Esto es necesario para apoyar varias operaciones; Un ejemplo sería el uso de controladores de filtro para motores antivirus y otro software (productos de cifrado y compresión sobre la marcha) que interceptan llamadas IO.
En * nix, tendrá la llamada al sistema stat() que realizará la actividad necesaria de lectura de la información del inodo para el descriptor del archivo.
Mida el tiempo necesario y mírese. Como dices, depende absolutamente del sistema de archivos .
long t1 = System.currentTimeMillis();
...Your File.exists call
long t2 = System.currentTimeMillis();
System.out.println("time: " + (t2 - t1) + " ms");
Verá que siempre le dará resultados diferentes, ya que también depende de la forma en que su sistema operativo almacena información en caché, de su carga, etc.