Pessoal, estou com dúvida de como apagar um registro em um arquivo binário (criado com a classe RandomAccessFile), não apenas “zerar” o registro, mas apagá-lo, diminuindo o tamanho do arquivo, sem alterar os outros.
Por exemplo:
Tenho um arquivo com o tamanho de 1000 bytes, sendo que cada registro tem 200 bytes, totalizando 5 registros. Quero apagar o registro que se encontra no byte 200 (de 200 a 400). Nesse caso eu poderia apenas zerar todos os campos do registro (atribuindo zero ou “”), mas isso não apagaria o registro e o arquivo continuaria com os 1000 bytes e o que eu quero é apagá-lo e diminuir o tamanho do arquivo para 800 bytes.
Não faço idéia de como fazer isso.
Grato.
Para fazer isso, você precisa copiar os registros que estão na frente deste uma posição pra trás cada um, ou seja, tendo 5 registros e para apagar o 2º, copie o 3º sobre o 2º, o 4º sobre o 3º e o 5º sobre o 4º.
Aí, é só usar o método setLength() com o novo valor do tamanho do arquivo.
beleza? flw
Normalmente bancos de dados não fazem isso frequentemente; eles deixam um byte reservado para indicar que o registro encontra-se ou não apagado.
Quando é necessário diminuir o espaço ocupado, então eles podem copiar apenas os registros não-apagados para um outro arquivo, e remover o arquivo original.
Valeu galera.
Então além de poder usar um arquivo auxiliar, eu posso setar o tamanho do arquivo com o setLength().
Me corrijam se eu estiver errado, acho que a forma descrita por dudaskank é mais rápida do que a do thingol (dependendo de qual for a posicão do registro a ser apagada), pois na forma do thingol será copiado um registro por um, enquanto na forma do dudaskank será “movido” só os registros posteriores ao que será apagado.
Até mais.
a solução do thingol é mais rápido pq qnd vc apaga usando uma flag, é só virtual. Ai vamos supor q esse arquivo tem um tamanho maximo X, então qnd estiver perto desse tamanho o sistema irá automaticamente pegar os registros q não estão com a flag ativada e coloca-los em um novo arquivo, apagando o original. já a outra idéia é mais lenta pq se o registro a ser apagado não for o último sempre vai haver um rearranjo nas posições.