Método Java java.nio.file.Files size()

Java File Java java.nio.file.Files


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

public static long size(Path path) throws IOException

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 superarInteger.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.nio.file.*;
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

// Para archivos que pueden ser muy grandes, considere usar una forma de visualización más amigable
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

  1. 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
  2. Enlaces simbólicos:

    • Si la ruta es un enlace simbólico, devuelve el tamaño del archivo real al que apunta el enlace
  3. 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
  4. Alternativas:

    • Para versiones antiguas de Java, se puede usarjava.io.File.length()

Casos de uso prácticos

Comprobación antes de la subida de archivos:

Ejemplo

// Verificar si el archivo excede el tamaño permitido
if (Files.size(filePath) > MAX_UPLOAD_SIZE) {
    throw new FileTooLargeException();
}

Gestión de espacio en disco:

Ejemplo

// Calcular el tamaño total de todos los archivos en el directorio
long totalSize = Files.walk(dirPath)
                    .filter(Files::isRegularFile)
                    .mapToLong(Files::size)
                    .sum();

Mostrar progreso:

Ejemplo

// Mostrar el progreso de la copia del archivo
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 File Java java.nio.file.Files

Otras extensiones