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.
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.
Para crear una instancia de File indicamos el nombre del fichero mediante un String:
File fichero = new File(“rutaFichero”);
Métodos:
Método | Descripció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();
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");
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.
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);
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:
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(); } }
Aunque la clase PrintWriter sea la más sencilla de usar, también podemos necesitar otros modos de escritura:
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.
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();
© 2022 Fernando Valdeón