Serialização: "Sobrescrever"

5 respostas
marcoantoniorocha

Galera, o que eu preciso fazer é o seguinte:

Tenho um ObjectOutputStream onde serializo todos os meus objetos... tenho também um inteiro antes dos meus objetos, que deveria indicar a quantidade de registros.

FileOutputStream fos = new FileOutputStream(fos);
ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeInt(0);
...
int counter = 0;
while (...) {
   counter++;
   oos.writeObject(o);
}

Gostaria de saber se há como sobreescrever o inteiro que gravei no início do arquivo... estou tentando com RandomAccessFile só que não estou obtendo sucesso.

Fico grato se alguém puder me ajudar.

Valeu!

5 Respostas

dukejeffrie

C precisa mesmo disso?? Digo, desse inteiro??

Se vc tá usando ObjectStreams pra ler e gravar, vc nao precisa gravar esse numero no arquivo, usa um List (java.util.List) e vai lendo até acabar (i.e., available() <= 0, EOF, etc).

Ou…
grava o inteiro antes de comecar a gravar os objetos. C nao tem como contar quantos existem antes de gravá-los?

Ou…
forca-bruta: grava um zero no counter, escreve os objetos, fecha o stream, abre de novo, grava o inteiro no comeco. Blargh, mas vai da sua pressa…

Sempre é bom mandar os Stack Traces das exceptions que vc receber. Vai que a gente tá discutindo aqui um monde de coisas, e seu problema nem tem a ver com acesso aleatorio…

boa sorte!!

marcoantoniorocha

Bom… respondendo às suas perguntas:

  1. Não tenho como contar os objetos antes de gravá-los.
  2. O inteiro eu utilizei como exemplo, mas se houver outra hipótese, aceito sugestões.
  3. Já tentei gravar o zero e depois tentei gravar o contador no começo do arquivo, mas na hora de abrir dá StreamCorruptedException

Valeu

dukejeffrie

Cara, vc já tentou fazer na fé?? Que nem eu sugeri no comeco, esquece o tal inteiro, vai gravando até acabar, depois fecha e pronto. Vc só tem objetos no arquivo (além do hipotético inteiro)??

[]s!!

louds

Cara, acho que é senso comum que voce jamais escreve mais de 1 objeto num ObjectStream. Pq isso é quase sempre pedir pra ter problema.

O arquivo tem 1 monte de header que se voce mexer neles, o negocio todo vai pro vinagre, olha a expecificação de serialização para ver doq tou falando.

A solução do teu problema é voce escrever apenas 1 objeto, um Collection ou um array. Alem da performance na hora de serializar ser superior, resolve teu problema do tamanho.

Mas se voce não pode se dar o luxo de ter todos objetos na memoria ao mesmo tempo e não sabe de antemão quantos são. As opções, que eu consigo imaginar são:

-Escreva num arquivo separado o tamanho

-Use um campo de metadata para guardar o número de registros, como alguma data, por exemplo. (gambiarra, forte)

-Escreva tudo no ObjectStream, feche ele, abra ele via RandomAccessFile e escreve o tamanho no final. Quando for ler, leia os bytes de tamanho no final do arquivo e de truncate nele.

-Escreva um parser para o formato de serialização da maquina virtual que voce ta usando e depois use ele para contar o número de registros.

marcoantoniorocha

Obrigado a todos.

A solução que adotei foi salvar a quantidade em um outro arquivo. Apenas respondendo ao último post, não terei problemas com vários objetos… abro o ObjectOutputStream somente uma vez e com a gambiarra do NoHeaderOutputStream.

Se quiser maiores detalhes, entre em contato ou procure sobre isso no site da Sun que tem bastante coisa também.

Criado 14 de julho de 2003
Ultima resposta 15 de jul. de 2003
Respostas 5
Participantes 3