Dic 072013
 
Artículo Java

Durante el desarrollo de una aplicación, es habitual que el programador se encuentra con la necesidad de procesar datos binarios, ya sean datos almacenados en una base de datos, datos leídos de un fichero, o datos recibidos a través de una conexión de red.

Java ofrece numerosas posibilidades para trabajar con este tipo de datos. En este artículo se comentan estas posibilidades y se ofrecen ejemplos de código para los procesamientos que con más frecuencia es necesario realizar sobre datos binarios.

1. Tipos de datos Java para almacenar valores binarios

A diferencia de otros lenguajes de programación como Perl o PHP, en Java cada variable es definida indicando el tipo de datos que puede contener. Entre los tipos de datos disponibles, hay una serie de ellos que resultan especialmente adecuados para almacenar datos binarios:

  • byte: una variable de tipo byte contiene un número entero de 8 bits con signo. El valor mínimo que se puede almacenar en una variable de tipo byte es -128 y el valor máximo es 127.
  • short: Una variable de tipo short contiene un número entero de 16 bits (2 bytes) con signo, y ocupa dos bytes en memoria. Los valores posibles para una variable de tipo short están en el rango -32,768 a 32,767 (inclusive).
  • int: Una variable int contiene un número entero de 32 bits con signo, y ocupa cuatro bytes en memoria, pudiendo almacenar valores entre  -2^31 y (2^31-1).
  • long: Una variable long contiene un numero entero de 64 bits (cuatro bytes) con signo, con valores entre -2^63 y (2^63-1).

En Java, al contrario que en otros lenguajes, no existe el modificador ‘unsigned’ para tipos de datos enteros, por lo que a la hora de procesar los datos mediante operaciones aritméticas, siempre hay que tener en cuenta que las variables enteras contienen valores con signo.

La manera más habitual de trabajar con datos binarios es almacenarlos en un array de bytes. El siguiente ejemplo de codigo crea un array de 256 bytes, y les asigna todos los posibles valores entre 0 y 255:

    byte datos[] = new byte[256];
    for (int i = 0; i < 256; i++) {
        datos[i] = (byte)i;
    }

2. Escribir un fichero binario con FileOutputStream

En Java, para escribir un array de bytes en un fichero binario basta con abrir el fichero mediante la clase FileOutputStream, y utilizar el método write().

Por ejemplo, para escribir el array de bytes que hemos creado en el apartado anterior:

    FileOutputStream fos = new FileOutputStream("datos.bin");
    fos.write(datos);
    fos.close();

Después, podemos comprobar el contenido del fichero “datos.bin” que se ha generado, abriéndolo con un editor hexadecimal.

En linux podemos también volcar su contenido en pantalla con el comando ‘od’ o ‘xxd’:

$ xxd datos.bin
0000000: 0001 0203 0405 0607 0809 0a0b 0c0d 0e0f  ................
0000010: 1011 1213 1415 1617 1819 1a1b 1c1d 1e1f  ................
0000020: 2021 2223 2425 2627 2829 2a2b 2c2d 2e2f   !"#$%&'()*+,-./
0000030: 3031 3233 3435 3637 3839 3a3b 3c3d 3e3f  0123456789:;<=>?
0000040: 4041 4243 4445 4647 4849 4a4b 4c4d 4e4f  @ABCDEFGHIJKLMNO
0000050: 5051 5253 5455 5657 5859 5a5b 5c5d 5e5f  PQRSTUVWXYZ[\]^_
0000060: 6061 6263 6465 6667 6869 6a6b 6c6d 6e6f  `abcdefghijklmno
0000070: 7071 7273 7475 7677 7879 7a7b 7c7d 7e7f  pqrstuvwxyz{|}~.
0000080: 8081 8283 8485 8687 8889 8a8b 8c8d 8e8f  ................
0000090: 9091 9293 9495 9697 9899 9a9b 9c9d 9e9f  ................
00000a0: a0a1 a2a3 a4a5 a6a7 a8a9 aaab acad aeaf  ................
00000b0: b0b1 b2b3 b4b5 b6b7 b8b9 babb bcbd bebf  ................
00000c0: c0c1 c2c3 c4c5 c6c7 c8c9 cacb cccd cecf  ................
00000d0: d0d1 d2d3 d4d5 d6d7 d8d9 dadb dcdd dedf  ................
00000e0: e0e1 e2e3 e4e5 e6e7 e8e9 eaeb eced eeef  ................
00000f0: f0f1 f2f3 f4f5 f6f7 f8f9 fafb fcfd feff  ................

si lo que queremos escribir es sólamente parte del array, el método write() tambien admite como argumentos un offset y una longitud:

write(byte[] b, int off, int len);

3. Leer un fichero binario con FileInputStream

La clase FileInputStream permite abrir un fichero que contiene datos binarios para ser leido con el método read(). En su versión más habitual, read() recibe como argumento un array de bytes y lee un número de bytes igual al tamaño del array. El valor devuelto es el número de bytes leídos, o -1 si se ha llegado al fin de fichero.

Por ejemplo, el siguiente código lee el fichero “datos.bin” de cien en cien bytes:

        byte inputBuffer[] = new byte[100];
        int nBytesRead;
        FileInputStream fis = new FileInputStream("datos.bin");
        while (true) {
            nBytesRead = fis.read(inputBuffer);
            System.out.println("Leidos " + nBytesRead + " bytes");
            if (nBytesRead <= 0) break;
        }
    }

si el fichero “datos.bin” contiene 256 bytes, el resultado escrito en pantalla es:

Leidos 100 bytes
Leidos 100 bytes
Leidos 56 bytes
Leidos -1 bytes

Referencias

Indice de artículos sobre programación en lenguaje Java

 Publicado por en 11:27 am

 Deja un comentario

(requerido)

(requerido)