Filtrar dados de arquivo texto separados por espaço

5 respostas
L

Caros colegas, boa noite, estou com a seguinte missão:

Ler um arquivo .PLY(de polígonos) e depois com base nas infos dele desenhar um objeto utilizando o OpenGL. Vou tentar utilizar o JOGL para isto, mas antes mesmo de botar a mão na massa no OpenGL eu parei na leitura do arquivo. :?

O arquivo .PLY tem a seguinte carinha.

ply
format ascii 1.0
comment created by platoply
element vertex 12
property float32 x
property float32 y
property float32 z
element face 20
property position 2 2 2
property lambient 0 0 0 1
property ldiffuse 1 1 1 1
property lspecular 1 1 1 1
property mambient 0 0 0 1
property mdiffuse 0.5 0 0 1
property mspecular 1 1 1 1
property shininess 10
property list uint8 int32 vertex_indices
end_header
0 -0.525731 0.850651 
0.850651 0 0.525731 
0.850651 0 -0.525731 
-0.850651 0 -0.525731 
-0.850651 0 0.525731 
-0.525731 0.850651 0 
0.525731 0.850651 0 
0.525731 -0.850651 0 
-0.525731 -0.850651 0 
0 -0.525731 -0.850651 
0 0.525731 -0.850651 
0 0.525731 0.850651 
3 6 2 1 
3 2 7 1 
3 5 4 3 
3 8 3 4 
3 11 5 6 
3 10 6 5 
3 2 10 9 
3 3 9 10 
3 9 8 7 
3 0 7 8 
3 1 0 11 
3 4 11 0 
3 10 2 6 
3 11 6 1 
3 10 5 3 
3 11 4 5 
3 9 7 2 
3 0 1 7 
3 8 9 3 
3 0 8 4

O problema que logo enfrentei foi de como eu vou desenterrar os vertices do arquivo(parte onde tem uns números decimais grandinhos). Estava usando o BufferedReader para ler o arquivo e extrair as informações baseando-me nas posições(substr), mas como eu tenho que pegar esses valores e jogá-los em um ArrayList de float(ou até double) não posso me basear em posições para cavá-los do arquivo.

Li algo sobre o DataInputStream para pegar tipos de dados(int, char, float) mas não sei como mesclar a leitura de texto(BufferedReader) e bytes(DataInputStream).

Caso alguma boa alma posso me ajudar, tenha a certeza que estará salvando uma alma do inferno :smiley:

5 Respostas

debersom

Existe uma classe (java.util.StringTokenizer) que separa em tokens uma String, você pode ter uma idéia melhor em:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/StringTokenizer.html

Agora acredito que o que você precisa pode ser resolvido usando a classe java.io.StreamTokenizer, ela recebe o seu arquivo e separa em tokens. E você ainda pode configurar diversos padrões a serem reconhecidos. Acesso a página da Sun que contém a descrição completa da classe.
http://java.sun.com/j2se/1.3/docs/api/java/io/StreamTokenizer.html

Espero ter ajudado. Abraços

Debersom

Rafael_Steil

Ao inves de usar StringTokenizer, utilize o metodo split() da classe String.

StreamTokenizer eh bastante lento tambem. O melhor seria voce ler o conteudo via BufferedReader() e processar cada linha com split().

Rafael

L

O problema é que eu preciso ler texto o dados texto(String) como dados numéricos(float).

Pelo InputStream eu consigo ler linhas do arquivo em formato String e float? Como eu iria fazer?

Confesso que quanto mais eu leio a respeito do java.io mais eu me perco, hehehe.

Obrigado pelas dicas!

Rafael_Steil

Voce le em String e depois faz a conversao para Double utilizando Doble.parseDouble(String)

Rafael

L

Rapaiz, tava testando esse tal de split e não que o trem funcionou!!!

Valeu Rafael, fucei tanto em classe de IO, interface, e mais uma porrada de coisa, sendo que um simples método da classe mais singela matou o meu problema…

O fórum aqui do GUJ sempre me ajudou 100% dos meus desesperos!!! hehehe, parabéns à todos!

Criado 12 de junho de 2004
Ultima resposta 13 de jun. de 2004
Respostas 5
Participantes 3