DataInputStream y DataOutputStream 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:

DataInputStream y DataOutputStream 1

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

Ejemplo de DataInputStream y DataOutputStream

Veamos un ejemplo:

También se puede crear así:

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:

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).

DataInputStream y DataOutputStream 2

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.

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.

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.

Te dejo algunos videos que te pueden ayudar.

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

Compartir

6 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.

  6. Javier

    Has escrito un fichero binario escribiendo un int, un string y otro int. En Pascal tendríamos para esto un «registro», de la forma:

    Var persona = record
    edad : int;
    nombre: string;
    fechaNac : int;
    end;

    Y para escribir en el fichero tendríamos :
    Write (archivo, persona);

    Eso escribe un registro entero. Para leer se haría

    read (archivo persona);

    Y eso nos lee el registro, o sea, los tres campos.

    ¿Se puede hacer en Java lo mismo? ¿Leer un registro, o estructura, de forma que los bytes leídos ya queden distribuídos en sus campos respectivos? Quiero decir sin tener que ir leyendo pequeñas unidades String, int o double y asignándolas a cada variable.

    Gracias.

Deja una respuesta

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


Warning: Trying to access array offset on value of type null in /home2/discodur/public_html/discoduroderoer/wp-content/themes/disto/single.php on line 539