New 2 Java: Construir una Aplicación: 4.- Leer y Escribir Ficheros y Manejar Excepciones

�D�nde deber�as escribir el c�digo para abrir un fichero?

El c�digo para abrir un fichero deber�a ir en una clausula try. El c�digo para manejar las excepciones que se puedieran lanzar deber�a ir en una clausula catch.

Por ejemplo: try { // C�digo que abre el fichero para lectura } catch (Exception e) { // C�digo que se ejecuta si se lanza una excepci�n, // como si el nombre del fichero no existe, por ejemplo. }

.�Manejar Excepciones

Las clases que manejan errores y excepciones son objetos de las clases Error o Exception para condiciones o errores generales, o m�s precisamente, una de sus subclases para condiciones m�s espec�ficas.

La imagen de abajo muestra el �rbol de herencia de la clase Throwable, y lista unas cuantas subclases de Error y Exception. Hay muchas m�s subclases que las listadas aqu�, pero el diagrama demuestra la idea general.

�C�mo sabemos qu� clases capturar? No necesitamos memorizar esas clases. Hay unas pocas reglas para descubrir qu� clase necesitamos capturar y posiblemente manejar en nuestras aplicaciones:

  • Buscar las clases y m�todos que est�mos usando en nuestro c�digo en la Documentaci�n del API Java .
  • Familiarizarnos con todas las clases Java.
  • No intentar capturar las condiciones, y permitir que el compilador nos diga qu� clases capturar y manejar.

El �ltimo punto de la lista es la forma m�s f�cil y com�n de determinar qu� clase o clases capturar. Si llamamos a m�todos de una clase que lanza una excepci�n, el compilador mostrar� un mensaje que nos permitir� conocerlas.

Por ejemplo, cuando escribimos c�digo para leer un fichero y cerrarlo, podr�amos generar un mensaje de error como �ste: NorthPanel.java:58: unreported exception java.io.I/OException; must be caught or declared to be thrown br.close(); ^ 1 error

Adem�s de decirnos que tipo de excepci�n necesitamos capturar, el compilador nos dice qu� m�todo est� causando el problema. en este caso, se debe capturar I/OException, y el m�todo que lanza este tipo de objeto excepci�n es close. En este c�digo la variable se refiere a la clase BufferedReader. En la documentaci�n espec�fica del m�todo close para clase BufferedReader dice: Throws: I/OException - If an I/O error occurs

Despu�s de trabajar un tiempo con las clases Java, te familiarizar�s con las clases que necesitan ser capturadas y manejadas, y cuales podemos declarar como lanzadas, lo que aprenderemos m�s adelante.

Ahora que sabemos qu� tipo de objeto error o excepci�n necesitamos capturar:

  • Escribimos el c�digo que queremos probar (try).
  • Capturamos (catch) el objeto error o excepci�n.
  • Escribimos instrucciones para ver c�mo la aplicaci�n maneja esa condici�n dentro del bloque catch.

En otras palabras, situamos el c�digo que puede lanzar una excepci�n en una clausula try, y luego capturamos cualquier excepci�n que podr�a ser lanzada en una o m�s clausulas catch.

Por ejemplo, aqu� definimos un m�todo que contiene c�digo que podr�a hacer que ocurriera alguna excepci�n. Supongamos que queremos leer un fichero. El pseudo-c�digo demuestra: public void doReadMethod() { try { // Open try clause C�digo que intenta leer un fichero particular } // Close try clause // Si hay un problema se lanza una excepci�n: catch (IOException ioe) { //Open catch System.out.println("Se ha lanzado una excepci�n: " + ioe); } // Close catch }

La clausula catch s�lo imprime informaci�n sobre la excepci�n en la salida est�ndar. Podemos hacer que haga algo m�s, como mostrar una caja de di�logo que ofrezca al usuario instrucciones de lo que hacer. Veremos un ejemplo de esto m�s adelante.

Hay m�s cosas en el manejo de excepciones, pero para esta clases y para la lectura y escrituras b�sicas en un fichero, estos fundamentos son suficientes por ahora.

.�Entrada y Salida en Java

Ahora que hemos entendido lo b�sico sobre c�mo se crean, se lanzan y se manejan los objetos error y excepci�n, podemos ir a leer y escribir ficheros..

El paquete java.io soporta transferencia de datos entre una aplicaci�n y la consola, un fichero o la red. Importamos este paquete en las aplicaciones que necesitan leer o escribir datos a un sistema de ficheros.

Hasta hora hemos ejemplarizado o creado objetos para todo en esta aplicaci�n, desde los botones a los campos de texto, las acciones y los eventos. Leer y escribir ficheros tambi�n implica objetos, especificamente objetos llamados streams. Podemos pensar en los streams como puentes. Un final del puente es el objeto punto de entrada y el otro final es el objeto destino. El puente es el objeto que usa un veh�culo para cruzar de un lado a otro del rio. Los streams sirven una funci�n similar.

La plataforma Java incluye dos �rboles de clases que soportan streams:

  • Entrada y salida orientada a bytes.
  • Entrada y salida orientada a caracteres.

En el uso de streams, los caracteres y bytes se leen o escriben en orden secuencial, caracter a caracter o byte a byte. Como la clase NorthPanel lee un fichero, esta secci�n del tutorial se enfoca en los streams basados en caracteres. Aprenderemos sobre los streams orientados a bytes m�s adelante en una secci�n sobre como escribir objetos a ficheros, serializarlos, y leerlos dentro de un GUI.

Los streams de caracteres pueden trabajar sobre entrada y salida y convertir cada caracter desde el esquema de codificaci�n de un sistema operativo nativo a conjunto de caracteres Unicode usado por la plataforma Java y que soporta una internacionalizaci�n completa.

Leer desde un fichero requiere tres pasos b�sicos:

  1. Asociar el fichero con un objeto File. (Esto no es obligatorio, pero podr�a ser �til). Al menos suministamos el nombre de fichero o directorio como un String.
  2. Asociar el objeto File con un stream de entrada.
  3. Pasar a trav�s de cada caracter o l�nea del stream de caracteres.

Lo que hagamos con los caracteres es cosa nuestra. Podemos enviarlos a la consola, mostrarlos en un GUI, o escribirlos en un fichero o base de datos. Los pasos de arriba implican clases que tambi�n requieren manejo de excepciones.

Al igual que creamos otros objetos, creamos un objeto stream ejemplarizando una de sus muchas clases. Primero, podr�amos necesitar informaci�n sobre el ficheros que queremos leer, como si el fichero existe o cuando fue la �ltima vez que se modific�. Para realizar chequeos sobre un fichero o directorio, asociamos el fichero con un ejemplar de la clase File: File f = new File("myfile.txt");

Un objeto File es una representaci�n abstracta de los paths de fichero y directorio, y tiene m�todos �tiles para hacer chequeos de un fichero, o incluso crear un fichero o directorio seg�n sea necesario. Aqu� tenemos unos pocos:

  • canRead()
    Comprueba si la aplicaci�n puede leer el fichero denotado por su path abstracto.
  • createNewFile()
    Crea autom�ticamente un nuevo fichero vac�o con el nombre del path abstracto si y s�lo si no existe un fichero con ese nombre.
  • delete()
    Borra el fichero o directorio denotado por su path abstracto.
  • exists()
    Comprueba si existe el fichero denotado por su path abstracto.
  • getAbsolutePath()
    Devuelve el path absoluto del path abstracto.
  • isFile()
    Comprueba si el fichero denotado por el path abstracto es un fichero normal.
  • mkdir()
    Crea el directorio llamado por este path abstracto.
  • setLastModified(long time)
    Selecciona la fecha de �ltima modificaci�n del fichero o directorio nombrado por su path abstracto.
Queremos leer un fichero en nuestra aplicaci�n, pero primero queremos chequear si puede leerse. Asumiendo que hemos asociado el nombre del fichero con un objeto File llamado f, �c�mo chequeamos si se puede leer el fichero?
  A  
if (File.canRead()) {
  System.out.println(File + "can be read.");
}
  B.  
if (f.canRead()) {
  System.out.println("File can be read.");
}
  C   Ninguna de ellas

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO