Método Java java.nio.file.Files size()
java.nio.file.Files.size()Es un método estático muy práctico en el paquete Java NIO (New I/O), que se utiliza para obtener el tamaño (en bytes) de un archivo especificado. Este método pertenece aljava.nio.filepaquete, que es parte de la API de operaciones de archivos introducida en Java 7.
Definición del método
Parámetros del método
Path path
- Tipo:
java.nio.file.Path - Descripción: representa el objeto de ruta del archivo cuyo tamaño se va a obtener
- Nota:
- Debe apuntar a un archivo que exista realmente
- No puede ser un directorio (de lo contrario, se lanza una excepción)
- La ruta puede ser absoluta o relativa
Valor de retorno
Tipo long
- Significado: Devuelve el tamaño del archivo, en bytes.
- Características:
- Si el archivo está vacío, devuelve 0
- Para archivos grandes, el valor de retorno puede superar
Integer.MAX_VALUE
Manejo de excepciones
size()El método puede lanzar las siguientes excepciones:
IOException
- Condiciones de activación:
- El archivo no existe
- No hay permiso para leer el archivo
- Se produce un error de entrada/salida
- La ruta apunta a un directorio, no a un archivo
SecurityException
- Condiciones de activación: Cuando el administrador de seguridad existe y deniega el acceso al archivo.
Ejemplo de uso
Uso básico
Ejemplo
import java.io.IOException;
public class FileSizeExample {
public static void main(String[] args) {
Path filePath = Paths.get("example.txt");
try {
long fileSize = Files.size(filePath);
System.out.println("File size: " + fileSize + " bytes");
} catch (IOException e) {
System.err.println("Error getting file size: " + e.getMessage());
}
}
}
Manejo de archivos grandes
Ejemplo
public static String formatFileSize(long size) {
if (size < 1024) return size + " B";
int exp = (int) (Math.log(size) / Math.log(1024));
char unit = "KMGTPE".charAt(exp-1);
return String.format("%.1f %sB", size / Math.pow(1024, exp), unit);
}
Consideraciones
Consideraciones de rendimiento:
- Para sistemas de archivos locales,
size()la operación suele ser muy rápida - Para sistemas de archivos en red, puede haber latencia
- Para sistemas de archivos locales,
Enlaces simbólicos:
- Si la ruta es un enlace simbólico, devuelve el tamaño del archivo real al que apunta el enlace
Bloqueo de archivos:
- El método no bloquea el archivo durante su ejecución, por lo que el tamaño del archivo puede cambiar inmediatamente después de obtenerlo
Alternativas:
- Para versiones antiguas de Java, se puede usar
java.io.File.length()
- Para versiones antiguas de Java, se puede usar
Casos de uso prácticos
Comprobación antes de la subida de archivos:
Ejemplo
if (Files.size(filePath) > MAX_UPLOAD_SIZE) {
throw new FileTooLargeException();
}
Gestión de espacio en disco:
Ejemplo
long totalSize = Files.walk(dirPath)
.filter(Files::isRegularFile)
.mapToLong(Files::size)
.sum();
Mostrar progreso:
Ejemplo
long totalBytes = Files.size(sourcePath);
long copiedBytes = 0;
// ...actualizar y mostrar el porcentaje de progreso en el bucle de copia...
Preguntas frecuentes
P1: ¿Se puede usar el método size() para directorios?
No, si la ruta apunta a un directorio, se lanzaráIOException. Para obtener el tamaño de un directorio, se necesita usarFiles.walk()recorrer el contenido del directorio y sumar los tamaños de los archivos.
P2: ¿Este método bloquea?
Por lo general, no bloquea de manera significativa en sistemas de archivos locales, pero puede haber latencia en sistemas de archivos en red.
P3: ¿Por qué el valor de retorno es long y no int?
Porque algunos archivos pueden superar los 2 GB (Integer.MAX_VALUE), usar long permite admitir archivos extremadamente grandes.
P4: ¿Cuál es la diferencia entre este método y File.length()?
Files.size()es parte de la API NIO.2, admite más características modernas del sistema de archivos (como enlaces simbólicos), mientras queFile.length()es un método de I/O tradicional.
Resumen
java.nio.file.Files.size()El método proporciona una forma simple y efectiva de obtener el tamaño de un archivo, y es un método de utilidad común en las operaciones con archivos. Comprender su uso y las excepciones potenciales es muy importante para escribir código robusto de manejo de archivos.
Java java.nio.file.Files