Diferencia entre revisiones de «Prog. Ficheros»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 51: Línea 51:
 
:* <u>Cerrar</u> el archivo.
 
:* <u>Cerrar</u> el archivo.
  
−
:* En nuestro caso, debemos crear un objeto de la clase FileReader, en el que podemos observar como el [https://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html#FileReader(java.lang.String) constructor] está sobrecargado, y en uno de ellos debemos enviar un String con la ruta y nombre del fichero a abrir.
+
: En nuestro caso, debemos crear un objeto de la clase FileReader, en el que podemos observar como el [https://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html#FileReader(java.lang.String) constructor] está sobrecargado, y en uno de ellos debemos enviar un String con la ruta y nombre del fichero a abrir.
−
:* Posteriormente debemos abrir el fichero, llamando al método open().
+
:* Al llamar al constructor ya nos abre el fichero para iniciar la lectura.
−
:* Después debemos leer del fichero carácter a carácter utilizando el método read() hasta el final del mismo. Esto lo sabemos ya que el método read() devuelve el valor -1.
+
:* Después debemos leer del fichero carácter a carácter utilizando el método read() hasta el final del mismo. Esto lo sabemos ya que el método read() devuelve el valor -1 cuando llega al final.
 
:* Finalmente debemos cerrar el fichero con el método close().
 
:* Finalmente debemos cerrar el fichero con el método close().
  
Línea 59: Línea 59:
  
 
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 
::<syntaxhighlight lang="java" line enclose="div" highlight="" >
 +
        FileReader f = null;
 
         try {
 
         try {
−
             FileReader f = new FileReader("/tmp/prueba.txt");
+
             f = new FileReader("/tmp/prueba.txt");
 
             int c;
 
             int c;
 
             while((c = f.read())!=-1) {
 
             while((c = f.read())!=-1) {
Línea 66: Línea 67:
 
             }
 
             }
 
              
 
              
−
          f.close();
 
 
              
 
              
 
         } catch (FileNotFoundException ex) {
 
         } catch (FileNotFoundException ex) {
Línea 73: Línea 73:
 
             System.err.println("Error al leer el contenido del fichero");
 
             System.err.println("Error al leer el contenido del fichero");
 
         }
 
         }
 +
        finally {
 +
            try {
 +
                if (f != null)
 +
                    f.close();
 +
            } catch (IOException ex) {
 +
                System.err.println("Error al leer cerrar fichero");
 +
          }
 +
      }
 
</syntaxhighlight>  
 
</syntaxhighlight>  
  

Revisión del 10:05 15 ene 2018

  • Este punto sólo sirve de apoyo y para realizar ejercicios, a los apuntes de Jose Luis Comesaña.
Otros apuntes.
  • En java, para entender el sistema de entrada/salida de información (es decir, como leer o escribir información desde o hacia cualquier dispositivo), es necesario entender el concepto de flujo.
Podemos definir flujo como una 'abstracción' que proporciona Java y que identifica a una secuencia de bytes desde un dispositivo de entrada hacia un dispositivo de salida.


A través de dichos flujos vamos a poder realizar lecturas y escrituras sobre diferentes dispositivos sin que el programador necesita saber nada acerca de ellos, ya que será el núcleo de Java el que se entenderá con el S.O. para realizar las operaciones correspondientes.


  • En Java, dichos flujos están identificados por una jerarquía de clases que se encuentran en el paquete java.io:


Prog io 1jpg.jpg
Imagen obtenida de los apuntes de Jose Luis Comesaña



  • Quizás podemos entender más claramente el concepto de flujo si nos fijamos cuando escribimos por teclado y desde nuestro programa guardamos dicha información o cuando mandamos escribir por consola un texto determinado.
En Java, las letras (información) que estamos tecleando llegan a nuestro programa a través de un 'flujo' de entrada, denominado 'flujo de entrada estándar' y posteriormente enviamos información a la consola a través de un 'flujo de salida estándar'. En caso de encontrar algún error también enviará un mensaje a la consola (como la salida) por medio de otro flujo de datos.
Estos flujos en Java los tenemos implementados en los objetos System.in, System.out y System.err.
Si observáis la definición de dichos objetos (son final y de clase) veréis que pertenecen a alguna de las clases de la jerarquía anterior.


En la jerarquía anterior vemos que hay ciertas clases que implementan un buffer (BufferedReader, BufferedInputStream,...).
Recordar que un buffer es una zona de almacenamiento, que se utiliza de 'puente' entre un dispositivo de entrada y otro de salida, para aumentar la velocidad en las operaciones de lectura y escritura así como el rendimiento.
Si usamos sólo FileInputStream, FileOuputStream, FileReader o FileWriter, cada vez que hagamos una lectura o escritura, se hará físicamente en el disco duro.
Si escribimos o leemos pocos caracteres cada vez, el proceso se hace costoso y lento, con muchos accesos a disco duro.
Los BufferedReader, BufferedInputStream, BufferedWriter y BufferedOutputStream añaden un buffer intermedio.
Cuando leamos o escribamos, esta clase controlará los accesos a disco.
  • Si vamos escribiendo, se guardarán los datos hasta que tenga bastantes datos como para hacer la escritura eficiente.
  • Si queremos leer, la clase leerá muchos datos de golpe, aunque sólo nos dé los que hayamos pedido. En las siguientes lecturas nos dará lo que tiene almacenado, hasta que necesite leer otra vez.
Esta forma de trabajar hace los accesos a disco más eficientes y el programa correrá más rápido. La diferencia se notará más cuanto mayor sea el fichero que queremos leer o escribir.


  • Veamos un sencillo ejemplo de cómo leer un archivo de texto.
Para ello, debemos hacer uso de la clase FileReader, que como comentamos antes, es una clase que sirve para leer caracteres.
Incorpora por tanto el método read.
Para leer un archivo siempre vamos a tener que realizar las siguientes operaciones:
  • Abrir el archivo para iniciar la lectura.
  • Leer del archivo hasta llegar al final del mismo.
  • Cerrar el archivo.
En nuestro caso, debemos crear un objeto de la clase FileReader, en el que podemos observar como el constructor está sobrecargado, y en uno de ellos debemos enviar un String con la ruta y nombre del fichero a abrir.
  • Al llamar al constructor ya nos abre el fichero para iniciar la lectura.
  • Después debemos leer del fichero carácter a carácter utilizando el método read() hasta el final del mismo. Esto lo sabemos ya que el método read() devuelve el valor -1 cuando llega al final.
  • Finalmente debemos cerrar el fichero con el método close().
  • Puede suceder que tengamos excepciones debido a que el fichero no exista o no se pueda leer o que durante el proceso de lectura dejemos de tener acceso al mismo (FileNotFoundException y IOException).
 1         FileReader f = null;
 2         try {
 3             f = new FileReader("/tmp/prueba.txt");
 4             int c;
 5             while((c = f.read())!=-1) {
 6                 System.out.print((char)c);
 7             }
 8             
 9             
10         } catch (FileNotFoundException ex) {
11             System.err.println("Fichero no encontrado");
12         } catch (IOException ex) {
13             System.err.println("Error al leer el contenido del fichero");
14         }
15         finally {
16             try {
17                 if (f != null)
18                     f.close();
19             } catch (IOException ex) {
20                 System.err.println("Error al leer cerrar fichero");
21           }
22        }












-- Ángel D. Fernández González -- (2017).