Herramientas de usuario

Herramientas del sitio


bloque3:ficheros

Manejo de ficheros de texto

Paquete java.io

Aparte de la entrada y salida estándar representadas por la clase System mediante in y out, tenemos la salida y entrada desde ficheros.

La mayoría de las clases para manejo de ficheros están en el paquete java.io, y por lo tanto deben ser importadas.

Algunos métodos de las clases que manejan ficheros lanzan excepciones que debemos controlar.

Clase File

La clase File se usa para representar un fichero o directorio desde un programa en Java. Con esta clase no se puede leer ni escribir en él, pero ofrece una serie de métodos interesantes.

Un objeto File es solamente una asociación a un fichero (ruta) en el sistema de archivos; El fichero real no tiene por qué estar creado.

Uso de la clase File

Para crear una instancia de File indicamos el nombre del fichero mediante un String: File fichero = new File(“rutaFichero”);

Métodos:

MétodoDescripción
boolean createNewFile()Crea el fichero asociado al objeto File. Para poder crearlo, no debe existir
boolean mkdir()Crea el directorio asociado al objeto File
boolean delete()Elimina el fichero o directorio. Si es un directorio debe estar vacío
boolean exists()true si el fichero representado existe
String getName() Devuelve el nombre del fichero o directorio
boolean isDirectory()true si es un directorio
boolean isFile()true si es un fichero
boolean canWrite()true si tengo permisos de escritura
boolean canRead()true si tengo permisos de lectura
String getPath()Devuelve la ruta con la que se creó el objeto
String getAbsolutePath()Devuelve la ruta absoluta
File getParentFile()Devuelve un objeto File asociado al directorio que contiene el objeto actual
long length()Devuelve el tamaño en bytes del fichero, ó 0 si no existe.
boolean mkdirs()Crea todos los directorios especificados en la ruta del objeto File, aunque no existan
boolean renameTo(File dest)Renombra el fichero, true si se ha podido
String[] list()Devuelve un array con los nombres de los archivos o directorios que contiene el directorio asociado al objeto File. null si no es un directorio
File fichero = new File("fichero.txt");
if(fichero.exists()){
   System.out.println("Nombre del archivo " + fichero.getName());
   System.out.println("Ruta " + fichero.getPath());
   System.out.println("Ruta absoluta" + fichero.getAbsolutePath());
   System.out.println("Tamano " + fichero.length());
}else{
   fichero.createNewFile();
}
 
File directorio = new File(“src\\directorio1”);
directorio.mkdir();

Ruta de un fichero

El nombre del fichero puede estar compuesto simplemente por una ruta relativa o por una ruta absoluta. Siempre que indiquemos solo un el nombre del fichero, se parte del directorio base del proyecto.

Para los siguientes ejemplos tengo un proyecto en Eclipse llamado “EjemploFicheros”:

//La carpeta del proyecto es EjemploFichero; contiene los directorios src, bin, etc
//Ruta relativa a la carpeta de mi proyecto: "EjemploFicheros/fichero.txt"
File fichero1 = new File("fichero.txt");
 
//Ruta relativa a la carpeta de mi proyecto: "EjemploFicheros/src/prueba1/fichero.txt"
File fichero1 = new File("src/prueba1/fichero.txt");
 
//Ruta absoluta dentro de mi sistema operativo: "C:/Program Files/fichero.txt"
File fichero1 = new File("C:/Program Files/fichero.txt");

Escribir texto con PrintWriter

La clase PrintWriter es una de las más fáciles de usar a la hora de escribir texto en un fichero. Usa los mismo métodos con los que escribimos por pantalla con System.out:

Si el fichero no existe, se crea. Si ya existe, se sobrescribe.

//Instanciamos PrintWriter a partir de un objeto File
File fichero = new File("fichero.txt");
PrintWriter escritor = new PrintWriter(fichero);
 
//o directamente
PrintWriter escritor = new PrintWriter("fichero.txt");
 
//escribir el contenido de un array de String en fichero
for(int i = 0; i < array.length; i++){
   escritor.println(array[i]);
}
 
//cerramos el PrintWriter
escritor.close();

Hay que tener en cuenta que las clases de entrada/salida a fichero pueden lanzar excepciones que debemos de controlar.

Añadir texto a un fichero existente

Siempre que escribamos en un fichero que ya existe, el fichero se sobrescribirá. PrintWriter no tiene control sobre esto, pero si la clase de la que hereda: FileWriter. En este caso debemos crear un PrintWriter a partir de un FileWriter.

Para añadir texto a un fichero en lugar de sobrescribirlo, indicaremos un segundo parámetro al constructor de FileWriter:

//Indicando true en el constructor de FileWriter, añadimos texto
File fichero = new File("fichero.txt");
FileWriter filewriter = new FileWriter(fichero, true);
PrintWriter escritor = new PrintWriter(filewriter);
 
//o sin el objeto File
FileWriter filewriter = new FileWriter("fichero.txt", true);
PrintWriter escritor = new PrintWriter(filewriter);

Leer texto con Scanner

La clase Scanner permite leer desde distintos flujos de entrada. Habitualmente hemos usado el flujo estándar System.in, pero también permite leer directamente desde un String, o desde un objeto File.

En este caso necesitamos siempre un objeto File, pero es la forma más sencilla de leer un fichero de texto.

File fichero = new File("fichero.txt");
Scanner lector = new Scanner(fichero);
 
String cadenaLeida = lector.nextLine();
int enteroLeido = lector.nextInt();
 
lector.close();

En algunos casos necesitamos leer desde un fichero sin saber cuantas lineas tiene:

File fichero = new File("fichero.txt");
Scanner lector = new Scanner(fichero);
 
//leo una linea, mientras queden lineas en el fichero
while(lector.hasNextLine()){
   System.out.println(lector.nextLine());
}
lector.close()

Control de Excepciones

Si hemos trabajado con fichero nos habremos dado cuenta de que lanzan excepciones que debemos de controlar si queremos usar estas clases.

El control de excepciones se puede hacer de muchas formas, pero hay algo que debemos intentar hacer siempre: asegurarnos de cerrar los recursos que puedan estar abiertos.

Para ello podemos usar la sentencia opcional finally del bloque try-catch:

FileWriter filewriter = null;
PrintWriter escritor = null;
try {
   filewriter = new FileWriter("fichero.txt",true);
   escritor = new PrintWriter(filewriter);
 
   //realizo todas las escrituras
 
} catch (IOException e) {
   e.printStackTrace();
}finally{
   try {
      if(filewriter != null) filewriter.close();
      if(escritor != null) escritor.close(); 
   } catch (IOException e) {
      e.printStackTrace();
   }
}

Otras formas de escribir en fichero

Aunque la clase PrintWriter sea la más sencilla de usar, también podemos necesitar otros modos de escritura:

  • FileWriter: la necesitamos para indicar si queremos o no añadir texto a un fichero.
  • BufferedWriter: se usa para no escribir contantemente en disco, y utiliza un buffer para almacenar los datos.

Todas las clases se pueden usar de forma conjunta:

FileWriter fw = new FileWriter("fichero.txt",true);
BufferedWriter bf = new BufferedWriter(fw);
PrintWriter escritor = new PrintWriter(bf);
 
escritor.println("Anado texto a un fichero, y uso buffer de lectura");
 
escritor.close()

Basta con cerrar el elemento que envuelve a los demás, en este caso PrintWriter.

Otras formas de leer desde fichero

Aparte de la clase Scanner, existen otras clases para leer desde fichero:

  • FileReader : permite acceder a un fichero en modo lectura.
  • BufferedReader : permite usar un buffer de lectura, para evitar el acceso constante a disco.
FileReader fr = new FileReader("fichero.txt");
BufferedReader lector = new BufferedReader(fr);
 
String cadenaLeida = lector.readLine();
while(cadenaLeida != null){
   System.out.println(cadenaLeida);
   cadenaLeida = lector.readLine();
}
 
lector.close();


© 2020 Fernando Valdeón

bloque3/ficheros.txt · Última modificación: 29/01/2019 10:47 por Fernando Valdeón