La clase File

De ChuWiki

¿Existe el fichero y es accesible?[editar]

La clase File en java representa un fichero y nos permite obtener información sobre él. Al instanciar la clase File con un fichero, no se abre el fichero ni es necesario que este exista y precisamente esa es la primera información útil que podemos obtener del fichero: saber si existe o no.

...
import java.io.File;
...
File f = new File("un_path/un_fichero.txt");
if (f.exists())
   // El fichero existe.
else
   // el fichero no existe.

Si el fichero existe, podemos no tener permisos para leerlo, así que otra comprobación útil es si se puede hacer en él la operación deseada

...
import java.io.File;
...
File f = new File("un_path/un_fichero.txt");

if (f.canRead())
   // El fichero existe y se puede leer.

if (f.canWrite())
   // El fichero existe y se puede escribir en él

if (f.canExecute())
   // El fichero existe y se puede ejecutar

Tenemos, además, los correspondientes métodos setReadable(), setReadOnly(), setWritable() y setExcutable() que nos permiten cambiar las propiedades del fichero siempre que seamos los propietarios del mismo o tengamos permisos para hacerlo.

Listar los ficheros de un directorio[editar]

La siguiente comprobación útil que se puede hacer con un File es determinar si es un fichero normal o es un directorio. Si es un directorio, podemos obtener un listado de los ficheros contenidos en él. El siguiente ejemplo muestra los ficheros y subdirectorios dentro de un directorio.

package com.chuidiang.ejemplos.file;

import java.io.File;

public class EjemploFile {

	public static void main(String[] args) {
		// Se crea el File del directorio
		File directorio = new File("src/main/java/com/chuidiang/ejemplos/");
		
		// Si es un directorio
		if (directorio.isDirectory()) {
			
			// obtenemos su contenido
			File[] ficheros = directorio.listFiles();
			
			// y lo sacamos por pantalla
			for (File fichero : ficheros)
				System.out.println(fichero.getName());
		}
	}
}

De la misma forma, el método getParent() nos permite obtener el directorio padre del File con el que estamos. Si es fichero, nos dará el directorio en el que estamos. Si es un directorio, nos devolverá el directorio padre.


Ficheros temporales[editar]

A veces nuestra aplicación puede querer crear un fichero temporal. Un fichero temporal es en el que nuestra aplicación quiere guardar datos temporalmente, pero que al terminar la aplicación dejan de tener sentido y, por tanto, se debe borrar el fichero.

Todos los sistemas operativos tienen un directorio especial para ficheros temporales. En los sistemas unix/linux suele ser el /tmp, mientras que en los sistemas windows suele ser C:\Documents and settings\usuario\Configuración local\Temp. El primer problema para crear un fichero temporal es localizar este directorio. El segundo, encontrar un nombre de fichero que estemos seguros que no existe. La clase File resuelve estos dos problemas por nosotros con el método createTempFile().

En cuanto al borrado del fichero una vez terminada nuestra aplicación, la clase File también nos lo soluciona con su método removeOnExit(). Veamos un ejemplo completo

package com.chuidiang.ejemplos.file;

import java.io.File;
import java.io.IOException;

public class EjemploFileTemporal {

	public static void main(String[] args) {
		try {
			// Creación del fichero temporal.
			// "prefijo" es cualquier cadena de al menos tres caracteres
			// Si usamos null de segundo parametro, se usara por defecto
			// ".tmp". Si no, se usara la que pongamos.
			File temporal = File.createTempFile("prefijo", null);
			
			// Se indica que se borre el fichero al terminar el programa
			temporal.deleteOnExit();
			
			// Se comprueba que se ha crado
			if (temporal.exists()) {
				System.out.println("Creado "+temporal.getName());
				// Aqui podemos abrir el fichero y escribir cosas en él
				// para leerlas más adelante, donde nos haga falta
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}



Ocupación del disco duro[editar]

La clase File también nos permite obtener un listado de las unidades de disco disponibles por medio del método listRoots(). Para cada una de ellas podemos a su vez obtener usando la clase File tanto el espacio total del disco como el espacio libre. Para ello, se usan los métodos getFreeSpace() y getTotalSpace(). De hecho, podemos usar estos dos métodos con cualquier fichero o directorio existente para obtener la ocupación del disco en el que está ubicado ese fichero.

El siguiente ejemplo da un listado de todas las unidades de disco mostrando el espacio libre y total de cada uno de ellos.

package com.chuidiang.ejemplos.file;

import java.io.File;

public class EjemploOcupacionDisco {

	public static void main(String[] args) {
		// Obtenemos los directorios raiz de cada disco disponible
		File[] roots = File.listRoots();
		
		// Escribimos el nombre del disco, su espacio libre y su espacio
		// total.
		for (File root : roots) {
			System.out.println("En " +root+" hay "+root.getFreeSpace() +
					" libres de un total de "+root.getTotalSpace());
		}
	}
}

Si tenemos intención de escribir en el disco y escirbir mucho, puede ser más interesante el método getUsableSpace() en vez de el getFreeSpace(). El método getUsableSpace() tiene en cuenta temas de permisos de escritura, de forma que nos da el espacio disponible para que nuestro programa escriba en él, descontando previamente el espacio libre en el que NO tenemos permisos de escritura.

Enlaces relacionados[editar]