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

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO

¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.