Clases DataInputStream y DataOutputStream para ficheros binarios en Java

Hola, a todos, hoy os explicare a como utilizar las clases DataInputStream y DataOutputStream.

Las clases DataInputStream y DataOutputStream nos permiten escribir y leer datos en ficheros binarios, indicando un tipo.

Estas clases se encuentran en el paquete java.io.

Cuando creamos un fichero binario propio, tenemos que leer  el fichero como lo escribimos. Por ejemplo, si escribimos, un numero, una cadena y otro numero, deberemos leerlo de la misma forma.

Debemos controlar las excepciones.

Recuerda que en los ficheros binarios todos los datos que contiene están juntos, no son como un fichero de texto. Por ejemplo:

ejemplo fich binario

Lo crearemos como un objeto cualquiera, pero debemos pasarle como parámetro un FileInputStream para un DataInputStream y un FileOutputStream para un DataOutputStream.

Veamos un ejemplo:

FileInputStream fis=new FileInputStream("D:\\fich_binario.ddr");
FileOutputStream fos=new FileOutputStream("D:\\fich_binario.ddr");

DataInputStream dis=new DataInputStream(fis);
DataOutputStream dos=new DataOutputStream(fos);

También se puede crear así:

DataInputStream dis=new DataInputStream(new FileInputStream("D:\\fich_binario.ddr"));
DataOutputStream dos=new DataOutputStream(new FileOutputStream("D:\\fich_binario.ddr"));

Ahora vamos a ver un ejemplo practico de como escribir es un fichero con DataOutputStream, usaremos el método write y el tipo de dato que queremos  escribir:

import java.io.*;
public class FicherosBinariosApp {

	public static void main(String[] args) {

		try(DataOutputStream dos=new DataOutputStream(new FileOutputStream("D:\\fich_binario.ddr"));){

			//Escribimos un numero
			dos.writeInt(23);

			//Escribimos una cadena
			dos.writeUTF("Fernando");

			//Escribimos un numero
			dos.writeInt(1990);

		}catch(IOException e){
			System.out.println("Error E/S");
		}

	}

}

Como vemos, usamos el método writeInt para números y writeUTF para cadenas y así para cada tipo de datos.

Si abrimos el archivo con el bloc de notas, veremos que aparecen algunos caracteres no legibles (alguno que otro si lo podremos leer).

ejemplo data

Ahora vamos a leer el fichero con un DataInputStream, usando el método read y el tipo de dato a leer, es importante que leamos como escribimos.

import java.io.*;
public class FicherosBinariosApp {

	public static void main(String[] args) {

		try(DataInputStream dis=new DataInputStream(new FileInputStream("D:\\fich_binario.ddr"));){

			//Leemos un numero y lo mostramos
			System.out.println(dis.readInt());

			//Leemos una cadena y lo mostramos
			System.out.println(dis.readUTF());

			//Leemos un numero y lo mostramos
			System.out.println(dis.readInt());

		}catch(IOException e){
			System.out.println("Error E/S");
		}

	}

}

Si ejecutamos el código anterior, veremos que lee sin problemas los datos antes introducidos. En caso de no leer correctamente los datos, no se leerán.

Cuando llega al final del fichero, lanza una excepción llamada EOFException.

import java.io.*;
public class FicherosBinariosApp {

	public static void main(String[] args) {

		try(DataInputStream dis=new DataInputStream(new FileInputStream("D:\\fich_binario.ddr"));){

			//Leemos un numero y lo mostramos
			System.out.println(dis.readInt());

			//Leemos una cadena y lo mostramos
			System.out.println(dis.readUTF());

			//Leemos un numero y lo mostramos
			System.out.println(dis.readInt());

			//Si intentamos leer de nuevo...
			dis.readInt();

		}catch(EOFException e){
			//... Nos saltara este mensaje
			System.out.println("Fin del fichero");
		}catch(IOException e){
			System.out.println("Error E/S");
		}

	}

}

La idea es usar es controlar esta excepción, cuando no sepamos la longitud exacta del fichero.

Si nos fijamos, al leer un tipo de datos, el puntero pasa automáticamente al final de este tipo de dato, nosotros solo tenemos que leer los datos que escribimos.

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Compartir

5 comentarios

  1. Poncho

    Hola, tengo una gran duda acerca de los DOS y DIS, todo esto me funciona correctamente, pero cuando vuelvo a correr mi programa, quiero que se escriban mas datos de los que ya tengo, pero al correrlo solamente se sobrescriben y lo que ya tenía se tira a la basura, ¿Como puedo hacer para que continue mi escritura en el archivo y no se sobreescriba?

  2. Disco Duro de Roer Post author

    Tienes que poner un segundo atributo ue es un booleano que indica si quieres continuar, tienes que poner true

  3. michael corner

    Si tuviera que leer de un archivo binario un objeto (serializable) como pondria?
    import java.io.*;
    public class FicherosBinariosApp {

    public static void main(String[] args) {

    try(DataInputStream dis=new DataInputStream(new FileInputStream(«D:\\fich_binario.ddr»));){

    //Leemos un numero y lo mostramos
    System.out.println(dis.read………?

  4. joselyn

    y para sumar las edades ingresadas como lo haria para sumar y mostrar

  5. JD

    Como puedo controlar que la excepción EOFException no se produzca y termine la ejecución del programa cuando se ha alcanzado el final del archivo, ya que no tengo la longitud exacta del archivo debido a que los datos que estoy almacenando son de diferentes tipos y en especial el String donde las cadenas de caracteres no son iguales.

    De que otra forma puedo leer los datos almacenados y saber que ya se ha alcanzado el final del archivo, para que no se produzca la excepción.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *