DataOutputStream t = new DataOutputStream(***); Probleminha...-

4 respostas
dcbasso

Pessoal estou com problemas com a classe “DataOutputStream”. Ela atende a minha necessidade de gravar informações literais, como variaveis int, long, byte… mas todo número que mando salvar ele coloca no arquivo mais 8bits ( 2 Hexadecimais) no final de cada variavel salva…
Será que não tem como remover isso?

Abraços a todos

4 Respostas

T

Não estou entendendo.

Como é que você quer salvar os números?

Gravar 1 byte - writeByte
Gravar 2 bytes - writeShort
Gravar 4 bytes - writeInt
Gravar 8 bytes - writeLong
Gravar 4 bytes como um float - writeFloat
Gravar 8 bytes como um double - writeDouble
Gravar uma string, com indicação de comprimento (2 bytes no começo) e codificação UTF-8 - writeUTF

Não se esqueça que você precisa de um editor hexadecimal para olhar a saída - não dá para carregar no Notepad (e pior ainda, salvar).

dcbasso

thingol to usando tudo que você disse e olhando no NotePad e no WinHex… ;]
Infelizmente ele sempre que você usa um writeByte, writeShort, writeInt, writeLong ele coloca algo como um separador, um valor de 00 em hexadecimal…

se eu mando salvar o valor 10 assim:

... short aux = 10; ... VARIAVEL.writeShort(aux); ...
ele deveria salvar no arquivo assim: (em HEXADECIMAL)
-> 00 0A
mas ele salva assim:
-> 00 0A 00

sempre ele coloca 00 no final… que eu faço :S

T
import java.io.*;
import java.util.*;

class ExemploDataOutputStream {

    static void printHex(byte[] b) {
        for (int i = 0; i < b.length; ++i) {
            if (i % 16 == 0) {
                System.out.print (Integer.toHexString ((i & 0xFFFF) | 0x10000).substring(1,5) + " - ");
            }
            System.out.print (Integer.toHexString((b[i]&0xFF) | 0x100).substring(1,3) + " ");
            if (i % 16 == 15 || i == b.length - 1)
            {
                int j;
                for (j = 16 - i % 16; j > 1; --j)
                    System.out.print ("   ");
                System.out.print (" - ");
                int start = (i / 16) * 16;
                int end = (b.length < i + 1) ? b.length : (i + 1);
                for (j = start; j < end; ++j)
                    if (b[j] >= 32 && b[j] <= 126)
                        System.out.print ((char)b[j]);
                    else
                        System.out.print (".");
                System.out.println ();
            }
        }
        System.out.println();
    }

    public void gerarArquivo (String nomeArquivo) throws Exception {
        DataOutputStream dos = new DataOutputStream (new BufferedOutputStream (new FileOutputStream (new File (nomeArquivo))));
        dos.writeByte ((byte) 0xCA);
        dos.writeShort ((short) 0xFEC0);
        dos.writeInt ((int) 0xCABABE12);
        dos.writeLong ((long) 0x34567890ABCDEF01L);
        dos.close();
    }
    public void mostrarArquivo (String nomeArquivo) throws Exception {
        BufferedInputStream fis = new BufferedInputStream (new FileInputStream (new File (nomeArquivo)));
        byte[] bytes = new byte[(int) new File (nomeArquivo).length()];
        fis.read (bytes);
        fis.close();
        printHex (bytes);
    }
    public static void main(String[] args) throws Exception {
        ExemploDataOutputStream e = new ExemploDataOutputStream();
        e.gerarArquivo("teste.bin");
        e.mostrarArquivo("teste.bin");
    }
}

Este programa imprime:

0000 - ca fe c0 ca ba be 12 34 56 78 90 ab cd ef 01     - .......4Vx.....
dcbasso

aaa resolvido… era um problema de um char, que vinha logo logo após a inserção de números… agora tá certo… hehehe
eu coloco um char ‘;’ logo após um número, mas usando o método writeChar(’;’), mas o certo é só mandar um write(’;’);
uhauhauhauha acontece, acontece… acho que agora vai dar tudo certo!

Criado 3 de dezembro de 2007
Ultima resposta 3 de dez. de 2007
Respostas 4
Participantes 2