Gravação de arquivo em Disco (MODO BINÁRIO)

Como vai, pessoal?

Seguinte, eu to com um probleminha, eu preciso finalizar uma etapa de um projeto da faculdade, que consiste basicamente em gravar,em disco, os dados de uma determindada variável em modo binário, no arquivo grav_bin.txt. Digamos que na variável “teste” eu tenha o conteudo “10101010”, então quando tento realizar a operação de gravação em disco, o arquivo gerado ocupa o espaço de 8 bytes ao invés de 8 bits, justamente por usar o modo de gravação “normal” ( [color=red]ObjectOutputStream objOut = new ObjectOutputStream(new FileOutputStream( new File( “grav_bin.txt” ) ) ); [/color])
Se alguem souber e puder me dizer como eu faço para gravar esses dados em disco no modo binário usando o JAVA, ficarei muito grato.

cara, te digo de adianto mas sem muita certeza, fiz um zerofiller em c++(programa que escreve zeros por todo o hd pra apagar dados de formatações passadas que ainda residem no disco), e pra isso tive que observar o comportamento dos arquivos no sistema fat32 e ntfs dos windows, e a conclusao foi a seguinte:

cada caractere num arquivo tipo o seu TXT, ocupa 1 byte, sendo assim, um arquivo TXT chamado noiamen.txt contendo “noiamen” como conteudo, ocupa 7 bytes no disco…

ou seja pro meu arquivo zerar 1GB do disco(deixar em branco mesmo, cheio de zeros), eu mandei ele escrever 1 bilhao de zeros num txt, gerando assim um arquivo de 1GB, por exemplo…entao a conclusao é que isso tem mais a ver com o sistema de arquivos que trata os dados dessa forma…

sei lá se isso te ajuda mas…=p

véio, nao é bem isso que eu quero, mas de qualquer forma eu agradeço…

eu preciso de uma estrutura em JAVA que me grave os dados em um arquivo, no modo binario, para que ao inves de escrever palavras (em termos de bytes) ele escreva apenas bits.

valeu!!!

Veja bem, o Java não faz muita distinção entre modo texto e modo binário. Todo arquivo para ele é aberto em modo binário.

A diferença está justamente nos streams que você utilizará para escrever no arquivo. O jeito que você fez, por exemplo, gravará objetos em modo binário desde que eles sejam serializáveis.

Você também poderia escrever diretamente no arquivo, usando para isso um DataOutputStream. O formato do arquivo e como a informação ficará estruturada lá dentro ficam por sua conta…

Por exemplo:

DataOutputStream dos = new DataOutputStream(new FileOutputStream("./teste.txt"); dos.writeInt(10); dos.writeUtf("Vinícius"); dos.writeChars(" Godoy de "); dos.writeBytes("Mendonça"); dos.writeBoolean(false); dos.writeDouble(5.35); dos.flush(); dos.close();

Se quiser escrever em modo texto, associe ao seu OutputStream um PrintWriter, ou outro stream que tenha sido feito para esse fim.

meu caro,

nao sei se estou errado, mas pelo que vi no exemplo, talvez a unica estrutura que ocupe 1 bit seja:

dos.writeBoolean(false);

teria eu, que converter minha cadeia de caracteres de 1’s e 0’s para “true” e “false”?
deve haver um modo mas pratico, não?

eu lembro que em Linguagem C tinhamos uma estrutura mais ou menos como essa:

[code]FILE *arquivo;

arquivo = fopen(“teste”,“wb”);[/code]

onde *arquivo é o ponteiro que aponta para o documento “teste” e a opção “wb” significa gravar em binarios, ou seja somente 1’s e 0’s

Para gravar dados do jeito que você quer, use um DataOutputStream, não um ObjectOutputStream (que grava a informação de serialização de objetos também).
Exemplo:

DataOutputStream dos = new DataOutputStream (new FileOutputStream ("teste.bin"));
byte teste = (byte) 0xAA; // 10101010 em binário
dos.writeByte (teste);
dos.close();

Acho que você não entendeu… o arquivo será aberto em modo binário pelo DataOuputStream.

Qualquer um daqueles métodos vai gravar cadeias de zeros e uns.

E acho que é o modo mais prático de se fazer isso…

Prezados,

Li o tópico todo e implementei um pouco diferente do que foi dito e, mesmo assim não funcionou, segue a implementação:

[code]
// Esta URL abaixo retorna uma imagem GIF realmente, apesar de estar colocando a mesma aqui apenas para que vocês possam visualizar o problema.
final String urlArquivo = “http://www.doobybrain.com/wp-content/uploads/2008/01/google-logo.gif”;
final InputStream fluxoConexao = new URL(urlArquivo).openStream();
final BufferedInputStream in = new BufferedInputStream(fluxoConexao);
final BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(arquivoLocal));

            int x;
            while ((x = in.read()) != -1) {
                out.write(x);
            }

            in.close();
            out.close();[/code]

Como vocês podem ver o objeto binário é uma imagem do tipo GIF, daí vocês podem me perguntar, porque não usar a classe ImageIO?

Eu tentei usar conforme abaixo:

                // Esta URL abaixo retorna uma imagem JPG realmente, apesar de estar colocando a mesma aqui apenas para que vocês possam visualizar o problema.
                final String urlArquivo = "http://www.ideachampions.com/weblogs/google-logo.jpg";
                final InputStream fluxoConexao = new URL(urlArquivo).openStream();
                ImageIO.write(ImageIO.read(fluxoConexao), "JPG", ImageIO.createImageOutputStream(arquivoLocal))

A mesma implementação acima serve para imagens PNG.

Alguém saberia responder o motivo de não funcionar com GIF e como fazer para resolver meu problema de tentar gravá-la?