Continuamos en RedesZone.net con nuestro Curso de Java. En la anterior entrega, realizamos una introducción a la entrada y salida en Java y hablamos brevemente de los Streams y de la función que desempeñan.
En el entrega de hoy continuaremos hablando de los Streams, explicaremos como se usan los Streams y como pueden emplearse utilizando una organización en jerarquías. Además, os daremos los primeros ejemplos de entrada y salida, en este caso, los ejemplos estarán orientados a entrada y salida de archivos binarios. Por lo que a lo largo de la entrega del día de hoy, encontraréis dos ejemplos resueltos y de los cuales podréis valeros para realizar prácticas por vuestra cuenta.
Vamos por lo tanto con el temario del día de hoy.
Uso de Streams
Normalmente se utilizan por parejas
- Formadas por un stream iniciador (en verde) y un filtro (en marrón)
OutputStream: Escritura de ficheros binarios
- FileOutputStream (iniciador): escribe bytes en un fichero
- ObjectOutputStream (filtro): convierte objetos y variables en arrays de bytes que pueden ser escritos en un OutputStream
InputStream: lectura de ficheros binarios
- FileInputStream (iniciador): lee bytes de un fichero
- ObjectInputStream (filtro): convierte en objetos y variables los arrays de bytes leídos de un InputStream
Jerarquías de clases: Streams de caracteres
• Writer: escritura de ficheros de texto
- FileWriter (iniciador): escribe texto en un fichero
- PrintWriter (filtro): permite convertir a texto variables y objetos para escribirlos en un Writer
• Reader: lectura de ficheros de texto
- FileReader (iniciador): lee texto de un fichero
- BufferedReader (filtro): lee texto (línea a línea) de un Reader
Salida binaria
Es posible escribir variables y objetos en un fichero binario
Para poder escribir un objeto su clase debe implementar la interfaz Serializable, de la manera siguiente:
[java]
import java.io.*;
public class Nombre implements Serializable
{…}
[/java]
Se usa la pareja de streams FileOutputStream (iniciador) y ObjectOutputStream (filtro).
Operaciones de las clase FileOutputStream
Operaciones de la clase ObjectOutputStream
Nota: Todos los métodos (incluido el constructor) lanzan IOException, es decir, error al acceder al OutputStream, que generalmente será un fichero.
Ejemplo de escritura de un objeto.
Imaginemos que tenemos una clase implementada que es la clase contacto, y que posee datos como su número de teléfono, su dirección nombre y apellidos. También tenemos una agenda telefónica que contiene un número x de contactos. Queremos diseñar un método que sea capaz de guardar una agenda con sus contactos en un fichero.
[java]
import java.io.*;
public class Contacto implements Serializable
{…}
[/java]
[java]
import java.io.*;
public class Agenda implements Serializable
{…
public void salvaAFichero(String nomFich)
throws IOException {
ObjectOutputStream sal = null;
try {
// Abre los streams iniciador y filtro
sal = new ObjectOutputStream(
new FileOutputStream(nomFich));
// graba el objeto actual
sal.writeObject(this);
} finally {
if (sal != null) {
sal.close(); // cierra los streams
}
}
}
[/java]
Nota: Muy importante que las clases que vayan a ser utilizadas en la escritura del fichero contengan la cabecera implements Serializable.
Entrada binaria
Es posible leer variables y objetos de un fichero binario que fue creado según lo expuesto en el apartado anterior
Se usa la pareja de streams FileInputStream (iniciador) y ObjectInputStream (filtro).
Operaciones de la clase FileInputStream
Operaciones de la clase ObjectInputStream.
- Los métodos lanzan las excepciones:
- IOException: problema al acceder al InputStream
- EOFException: alcanzado el fin de fichero
- ClassNotFoundException: sólo producida por readObject
- Ejemplo de leer un objeto
Vamos a leer la agenda que anteriormente hemos guardado en un fichero.
[java]
static public Agenda leeDeFichero(String nomFich)
throws IOException, ClassNotFoundException {
ObjectInputStream ent = null;
try {
// abre el fichero
ent = new ObjectInputStream(
new FileInputStream(nomFich));
// lee el objeto y le retorna
return (Agenda)ent.readObject();
} finally {
if (ent != null) {
ent.close(); // cierra los streams
}
}
}
[/java]
Hasta aquí la entrega de hoy. Los ejemplos que os hemos puesto os pueden valer como plantilla, ya que se trata de algo «genérico» y la base para leer fichero binarios o escribirlos es la misma, pero con los matices que tiene cada problema.
En la siguiente entrega continuaremos con la entrada y salida, en este caso, será el turno para los ficheros de texto.