Curso de Java. Entrada y salida con ficheros: Primeros ejemplos

Escrito por Adrián Crespo
Java
1

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:


import java.io.*;

public class Nombre implements Serializable

{...}

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.


import java.io.*;

public class Contacto implements Serializable

{...}

 


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

}

}

}

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:
  1. IOException: problema al acceder al InputStream
  2. EOFException: alcanzado el fin de fichero
  3. ClassNotFoundException: sólo producida por readObject
  4. Ejemplo de leer un objeto

Vamos a leer la agenda que anteriormente hemos guardado en un fichero.


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

}

}

}

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.


Continúa leyendo
  • victor garay

    Si me podrian ayudar con el codigo de guardar, al parecer se esta reescribiendo cada vez que guarado los datos de los pacientes en un archivo binario(los pacientes cuentan con su fotografía). aqui les dejo el codigo de guardar y de buscar:

    private void btcGuardarActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    Object nombreArchivo = archivo;
    System.out.println(nombreArchivo);
    try{
    ObjectOutputStream fileout = new ObjectOutputStream(new FileOutputStream((String) nombreArchivo));
    fileout.writeObject(txtNroExpediente.getText());
    fileout.writeObject(txtDni.getText());
    fileout.writeObject(txtApellidos.getText());
    fileout.writeObject(txtNombres.getText());
    fileout.writeObject(txtDireccion.getText());
    fileout.writeObject(txtTelefono.getText());
    fileout.writeObject(lblFoto.getIcon());
    JOptionPane.showMessageDialog(null, “Los datos del paciente se guardaron corecttamente…”);
    if(fileout!=null){
    fileout.close();
    }
    }catch(IOException e){}
    desactivarTextFields();
    btcGuardar.setEnabled(false);
    btcNuevo.setEnabled(true);
    btcBuscar.setEnabled(false);
    }

    private void btcBuscarActionPerformed(java.awt.event.ActionEvent evt) {
    // TODO add your handling code here:
    Object nombreArchivo = archivo;
    try{
    try (ObjectInputStream filein = new ObjectInputStream(new FileInputStream((String) nombreArchivo))){
    Object expediente = filein.readObject();
    Object dni = filein.readObject();
    Object apellidos = filein.readObject();
    Object nombres = filein.readObject();
    Object direccion = filein.readObject();
    Object telefono = filein.readObject();
    Object foto = filein.readObject();
    if (txtNroExpediente.getText().equals(expediente)){
    txtNroExpediente.setText((String) expediente);
    txtDni.setText((String) dni);
    txtApellidos.setText((String) apellidos);
    txtNombres.setText((String) nombres);
    txtDireccion.setText((String) direccion);
    txtTelefono.setText((String) telefono);
    lblFoto.setIcon((Icon) foto);
    }
    if(filein!=null){
    filein.close();
    }
    } catch (ClassNotFoundException ex) {
    Logger.getLogger(JDPacientes.class.getName()).log(Level.SEVERE, null, ex);
    }
    }catch(IOException e){}
    }