RandomAccessFile ou Banco de Dados?

1 resposta
L

Tenho a seguinte situação:

Vários arquivos em formato texto, da seguinte maneira:

2J01	ALA	C	204	-169.31	36.55
2F1V	ALA	A	170	-168.54	14.31
1W97	ALA	L	180	-168.43	-7.67
...

preciso acessar aleatoriamente as linhas desses arquivos. como em formato texto puro nao existe um seek() ou similar, a ideia seria transformar esse arquivo em um arquivo binario com a classe RandomAccessFile, para que eu possa usar o método seek().

em C++, o seek em um arquivo binario funcionaria assim:

inFile.seekg(sizeof(suaEstrutura)*posicaoDesejada);

em Java, no RandomAccessFile (pelo que vi) não há um writeObject() ou equivalente.

a minha pergunta é: há uma solução para este problema utilizando arquivos? alguma outra classe? em ultimo (mas ultimo mesmo!) caso eu poderia definir um DB, mas provavelmente me tomaria mais tempo desenvolver toda a base de dados do que usar arquivos binários.

Grato,
Luís Henrique

1 Resposta

A

Acho que você pode usar um ObjectInputStream, usando como InputStream o RandomAccessFileInputStream a partir do RandomAccessFile.
Para acessar um objeto, basta chamar o método readObject do ObjectInputStream. Você pode fazer uma navegação no arquivo usando os métodos reset() skip() do ObjectInputStream, mas será necessário conhecer de antemão o tamanho de um dos seus objetos quando serializado, mas para isso, existem formas de calcular pelo menos uma vez usando um ObjectOutputStream que tem como OutputStream um ByteArrayOutputStream.

Algo do tipo:

public int sizeofobject( Object obj )
{
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try
    {
	    ObjectOutputStream oos = new ObjectOutputStream( baos );
	    oos.writeObject( obj );
	    return baos.toByteArray().length;
    }
    catch( Exception e )
    {
    	e.printStackTrace();
    }
    return -1;
}
public Object readMyObjFromFile( RandomAccessFile raf, int index, int knownSize )
{
	try
	{
	    ObjectInputStream ois = new ObjectInputStream( new RandomAccessFileInputStream( raf, 0 ) );
	    ois.reset();
	    ois.skip( index * knownSize );
	    return ois.readObject();
	}
	catch( Exception e )
	{
		e.printStackTrace();
	}
	return null;
}

Obs: o RandomAccessInputStream é algo da biblioteca Unified I/O, que você pode baixar de http://reader.imagero.com/uio/
Obs2: eu não cheguei a testar o código, só verifiquei a sintaxe e desenvolvi um mínimo de tratamento de exceções.
Obs3: outra coisa que posso te sugerir é usar java com sqlite e armazenar seus objetos de forma serializada, só que também nunca fiz isso, mas sabe como é, google…

Criado 24 de outubro de 2009
Ultima resposta 25 de out. de 2009
Respostas 1
Participantes 2