Diferencia entre revisiones de «Prog. Ficheros»
Ir a la navegación
Ir a la búsqueda
Imagen obtenida de los apuntes de Jose Luis Comesaña
| Línea 19: | Línea 19: | ||
| − | * Quizás podemos entender más claramente el concepto de flujo si nos fijamos cuando escribimos por teclado y | + | * 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 | + | : 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 | + | : 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. | : 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. | ||
| Línea 42: | Línea 42: | ||
| + | |||
| + | * 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: | ||
| + | :* <u>Abrir</u> el archivo para iniciar la lectura. | ||
| + | :* <u>Leer</u> del archivo hasta llegar al final del mismo. | ||
| + | :* <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. | ||
| + | :* Posteriormente debemos abrir el fichero, llamando al método open(). | ||
| + | :* 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. | ||
| + | :* 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). | ||
| + | |||
| + | ::<syntaxhighlight lang="java" line enclose="div" highlight="" > | ||
| + | try { | ||
| + | FileReader f = new FileReader("/tmp/prueba.txt"); | ||
| + | int c; | ||
| + | while((c = f.read())!=-1) { | ||
| + | System.out.print((char)c); | ||
| + | } | ||
| + | |||
| + | f.close(); | ||
| + | |||
| + | } catch (FileNotFoundException ex) { | ||
| + | System.err.println("Fichero no encontrado"); | ||
| + | } catch (IOException ex) { | ||
| + | System.err.println("Error al leer el contenido del fichero"); | ||
| + | } | ||
| + | </syntaxhighlight> | ||
Revisión del 09:46 15 ene 2018
- Este punto sólo sirve de apoyo y para realizar ejercicios, a los apuntes de Jose Luis Comesaña.
- 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:
- 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.
- Bufferes (información obtenida de estos apuntes).
- 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.
- Posteriormente debemos abrir el fichero, llamando al método open().
- 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.
- 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 try { 2 FileReader f = new FileReader("/tmp/prueba.txt"); 3 int c; 4 while((c = f.read())!=-1) { 5 System.out.print((char)c); 6 } 7 8 f.close(); 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 }
-- Ángel D. Fernández González -- (2017).
