====== 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 [[https://docs.oracle.com/javase/8/docs/api/java/io/File.html|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é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();
==== 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();
----
{{ vimeo>313988435?medium }}
----
(c) {{date> %Y}} Fernando Valdeón