Obtener información de un archivo en Java

Todo lo que se puede preguntar sobre un archivo está en dos sitios: en el Path, que son preguntas sobre el nombre, y en Files, que son preguntas sobre el disco. Saber cuál es cuál evita sorpresas.

Lo que sabe el Path, sin tocar el disco

Path ruta = Path.of("salida", "notas.txt");

IO.println("nombre   : " + ruta.getFileName());
IO.println("carpeta  : " + ruta.getParent());
IO.println("absoluta : " + ruta.toAbsolutePath());
salidanombre   : notas.txt
carpeta  : salida
absoluta : /trabajo/l2/salida/notas.txt
Un Path es solo una ruta, como una cadena bien formada: se puede construir para un archivo que no existe y getParent() funciona igual. Para saber algo del archivo de verdad hay que preguntarle a Files, y ahí sí se toca el disco.

Lo que hay que preguntarle al disco

IO.println("existe     : " + Files.exists(ruta));
IO.println("es archivo : " + Files.isRegularFile(ruta));
IO.println("es carpeta : " + Files.isDirectory(ruta));
IO.println("tamaño     : " + Files.size(ruta) + " bytes");
IO.println("legible    : " + Files.isReadable(ruta));
IO.println("escribible : " + Files.isWritable(ruta));
IO.println("oculto     : " + Files.isHidden(ruta));
IO.println("tipo       : " + Files.probeContentType(ruta));
salidaexiste     : true
es archivo : true
es carpeta : false
tamaño     : 6 bytes
legible    : true
escribible : true
oculto     : false
tipo       : text/plain

probeContentType devuelve el tipo MIME, que en Linux sale de la base de datos del sistema y puede ser null si no lo reconoce: conviene comprobarlo antes de usarlo.

Las fechas, todas de una vez

BasicFileAttributes a = Files.readAttributes(ruta, BasicFileAttributes.class);
var f = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss").withZone(ZoneId.systemDefault());

IO.println("creado     : " + f.format(a.creationTime().toInstant()));
IO.println("modificado : " + f.format(a.lastModifiedTime().toInstant()));
salidacreado     : 08/10/2026 06:41:01
modificado : 08/10/2026 06:41:01
Pide los atributos de golpe, no uno a uno. Cada Files.isDirectory, cada Files.size es una llamada al sistema operativo. readAttributes los trae todos en una, y el objeto que devuelve tiene además size(), isDirectory() y isRegularFile(). Recorriendo una carpeta con miles de archivos, la diferencia se nota.

Permisos de Unix

var permisos = Files.getPosixFilePermissions(ruta);
IO.println(PosixFilePermissions.toString(permisos));
salidarw-r--r--

Solo en sistemas POSIX. En Windows lanza UnsupportedOperationException, así que si el programa tiene que correr en los dos sitios conviene preguntar antes con FileSystems.getDefault().supportedFileAttributeViews().contains("posix").

Quieres saber…Pregunta a
El nombre o la carpetaruta.getFileName(), ruta.getParent()
Si existeFiles.exists(ruta)
Cuánto ocupaFiles.size(ruta)
Cuándo se modificóFiles.getLastModifiedTime(ruta)
Varias cosas a la vezFiles.readAttributes(ruta, BasicFileAttributes.class)
El tipo de contenidoFiles.probeContentType(ruta)

Más información en inglés: Get information from a file in Java.

Todo el código se compiló y se ejecutó con Java 25 LTS en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.