13 nov 2015

Lectura / Escritura de objetos en Java

Con algunas limitaciones, los objetos se pueden leer y escribir en flujos de forma similar a los tipos primitivos. Concretamente, las clases ObjectInputStream y ObjectOutputStream poseen las mismas funcionalidades que DataInputStream y DataOutputStream (y otras específicas de objetos), lo cual da lugar a que un flujo de objetos pueda contener tanto tipos primitivos como objetos.

Los métodos que más interés tienen son
Object readObject()
void writeObject(Object obj)
que leen/escriben el próximo objeto presente en el flujo.


Ejemplo de uso:

package flujosdeobjetos;

import java.io.*;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;

public class FlujosDeObjetos {

    static final String archivoDeDatos = "datosDeFacturacion.bin";
    static final BigDecimal[] precio_unitario = {
        new BigDecimal("19.99"),
        new BigDecimal("9.99"),
        new BigDecimal("15.99"),
        new BigDecimal("3.99"),
        new BigDecimal("4.99")};
    static final int[] num_unidades = {12, 8, 13, 29, 50};
    static final String[] descripciones = {"memoria usb",
        "tarjeta sd",
        "teclado",
        "disco usb",
        "disco duro"};

    public static void main(String[] args)
            throws IOException, ClassNotFoundException {

        TimeZone tz = TimeZone.getTimeZone("Europe/Madrid");
        Locale loc = new Locale("ES");
        Calendar cal = Calendar.getInstance(tz, loc);

        ObjectOutputStream f_sal = null;
        try {
            f_sal = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(archivoDeDatos)));

            f_sal.writeObject(cal);
            for (int i = 0; i < precio_unitario.length; i++) {
                f_sal.writeObject(precio_unitario[i]);
                f_sal.writeInt(num_unidades[i]);
                f_sal.writeUTF(descripciones[i]);
            }
        } finally {
            f_sal.close();
        }

        ObjectInputStream f_ent = null;
        try {
            f_ent = new ObjectInputStream(new BufferedInputStream(new FileInputStream(archivoDeDatos)));

            Calendar fecha = null;
            BigDecimal precio;
            int unidades;
            String descripcion;
            BigDecimal total = new BigDecimal(0);

            fecha = (Calendar) f_ent.readObject();
            System.out.format("Hoy es %tA, %<te de %<tB de %<tY:%n%n", fecha);

            try {
                while (true) {
                    precio = (BigDecimal) f_ent.readObject();
                    unidades = f_ent.readInt();
                    descripcion = f_ent.readUTF();
                    total = total.add(precio.multiply(new BigDecimal(unidades)));
                }
            } catch (EOFException e) {
            }
            System.out.format("%nImporte total: %.2f€%n", total);
        } finally {
            f_ent.close();
        }
    }

}

No hay comentarios:

Publicar un comentario