Lendo um arquivo Byte a Byte

11 respostas
P

Fala galera tudo certo?

Gostaria de saber como faço para ler um arquivo txt byte a byte?

Pois eu estou querendo ler uma estrutura de um aquivo e no layout está informando para eu ler esse arquivo byte a byte. mais num consegui descobrir como ler byte a byte no Java..

por exemplo o layout está me apresentando algo assim:

--| SFF file structure
|--------------------------------------------------*\
Version 1.01
HEADER (512 bytes)
------
Bytes
00-11 "ElecbyteSpr[code]--| SFF file structure
|--------------------------------------------------*\
Version 1.01
HEADER (512 bytes)
------
Bytes
00-11 "ElecbyteSpr\0" signature [12]
12-15 1 verhi, 1 verlo, 1 verlo2, 1 verlo3 [04]
16-19 Number of groups [04]
20-24 Number of images [04]
24-27 File offset where first subfile is located [04]
28-31 Size of subheader in bytes [04]
32 Palette type (1=SPRPALTYPE_SHARED or 0=SPRPALTYPE_INDIV) [01]
33-35 Blank; set to zero [03]
36-511 Blank; can be used for comments [476]

SUBFILEHEADER (32 bytes)
-------
Bytes
00-03 File offset where next subfile in the "linked list" is [04]
located. Null if last subfile

04-07 Subfile length (not including header) [04]
Length is 0 if it is a linked sprite
08-09 Image axis X coordinate [02]
10-11 Image axis Y coordinate [02]
12-13 Group number [02]
14-15 Image number (in the group) [02]
16-17 Index of previous copy of sprite (linked sprites only) [02]
This is the actual
18 True if palette is same as previous image [01]
19-31 Blank; can be used for comments [13]
32- PCX graphic data. If palette data is available, it is the last
768 bytes.
--------------------------------------------------------------------------
" signature [12] 12-15 1 verhi, 1 verlo, 1 verlo2, 1 verlo3 [04] 16-19 Number of groups [04] 20-24 Number of images [04] 24-27 File offset where first subfile is located [04] 28-31 Size of subheader in bytes [04] 32 Palette type (1=SPRPALTYPE_SHARED or 0=SPRPALTYPE_INDIV) [01] 33-35 Blank; set to zero [03] 36-511 Blank; can be used for comments [476]

SUBFILEHEADER (32 bytes)
-------
Bytes
00-03 File offset where next subfile in the "linked list" is [04]
located. Null if last subfile

04-07 Subfile length (not including header) [04]
Length is 0 if it is a linked sprite
08-09 Image axis X coordinate [02]
10-11 Image axis Y coordinate [02]
12-13 Group number [02]
14-15 Image number (in the group) [02]
16-17 Index of previous copy of sprite (linked sprites only) [02]
This is the actual
18 True if palette is same as previous image [01]
19-31 Blank; can be used for comments [13]
32- PCX graphic data. If palette data is available, it is the last
768 bytes.
--------------------------------------------------------------------------[/code]

O arquivo a ser lido está em anexo. ao post.

Será que alguem pode me dar uma luz de como ler byte a byte.. nem precisa montar o script para ler isso ae pq eu quero montar sozinho se não num aprendo java =D

A e tbm o comando para mover o ponteiro para o byte tal.... valeu...

Eu estou lendo o arquivo assim:

File arquivo = new File('kfm.sff');
stream = new FileInputStream(arquivo);
buffStream = new BufferedInputStream(stream);
data = new DataInputStream(buffStream);

Não sei se o data.readByte() lé byte a byte

Mais eu preciso que ele leia uma sequencia de byte exemplo preciso retorna 12 bytes para poder recuperar o nome da assinatura e assim vai indo... como eu faria isso? se eu fazer isso ele imprime :P mais num é legal claro

Exemplo: tou postando linha por linha para demonstrar o que está acontencendo...
data.readByte() // 1 byte
data.readByte() // 2 byte
data.readByte() // 3 byte
data.readByte() // 4 byte
data.readByte() // 5 byte
data.readByte() // 6 byte
data.readByte() // 7 byte
data.readByte() // 8 byte
data.readByte() // 9 byte
data.readByte() // 10 byte
data.readByte() // 11 byte
data.readByte() // 12 byte

Se fose em Python eu faria algo assim:

data.read(12); ai ele já me retornaria os 12 primeiros bytes ;)

Lembrando que eu conheço de programação... programo em php a mais de 4 anos e usando classes.

arquivo:
http://www.paodemugen.com.br/download/arquivos/kfm.sff

valeu desde já ;)

11 Respostas

BrunoBastosPJ

use o método read de BufferedInputStream, e bem vindo ao mundo Java! hehehehe

http://java.sun.com/j2se/1.4.2/docs/api/java/io/BufferedInputStream.html#read()

P

Opa… eu etou usando o DataInputStream pq ele já possui alguns metodos de converção de dados… como Char, Byte e tals… e eu vou precisar disso…

Se alguem poder me encinar como usa o read(byte[] b, int off, int len) eu acho que deve ser isso ae … mais num sei usar =/

BrunoBastosPJ

DataInputStream estende FilterInputStream. Você pode chamar o método read() da classe FilterInputStream nela. Já tentou chamar o método read nela?

Não trabalhei muito tempo com streams, mas acho que se você chamar algo do tipo

byte[] b = new byte[12];
data.read(b);

Ele vai mover 12 posições, se não for o final do arquivo. Tenta ai e posta o que aconteceu!

Abs

P

eu já havia tbm testado isso ae… e ele me retornava ao inves do valor ele retornava o valor de bytes que colocava em [aqui]

Ex:

byte[] buff = new byte[12];
System.out.print(data.read(buff));

ele printa o numero 12

byte[] buff = new byte[1];
System.out.print(data.read(buff));

printa numero 1…

Achei estranho pois pensei que se fize-se dessa maneira ae ele iria retorna 12 bytes do meu arquivo mais num foi isso que aconteceu…

BrunoBastosPJ

Eu não disse que o método read(byte[]) te retornava um array de bytes… Eu disse que ele fazia o DataInputStream andar 12 posições…

Se você quiser pegar 1 byte você pode usar o método read(), este sim te retorna 1 byte…

Se você quiser que o método read te “retorne” um array de bytes, é um pouco diferente… Na verdade ele não te retorna, ele preenche seu array…

No código acima ele retorna o tamanho que foi preenchido, e depois se você imprimir seu array de bytes em um loop você pode ver o valor dos bytes “retornados”

Eu entendi que você queria pegar 1 byte, e sugeri usar o método read(). E também entendi que você queria fazer a posição andar no Stream e sugeri o método read(byte[])

Não era isso que você queria?

P

É assim… em alguns caso eu preciso retorna 1 Byte e em outro caso preciso retorna x bytes.

exemplo…

Imagine que eu tenha isso:

“ola mundo”

para eu retorna 1 byte eu faria

data.read(); e entao ele iria imprimir “o”

mais ai eu quero retorna o ola. então são 3 bytes

Como eu retornaria isso? pelo que entendi vc explicando o read(new byte[12]) ele vai me retorna um array contendo 12 elementos cada elemento com o retorno de 1 byte do arquivo. correto?

Edit:

Eu estava vendo aqui e o read() ele retorna um (int)

BrunoBastosPJ

Vamos lá…

o método read(byte[]) preenche o array de bytes e retorna a quantidade de bytes lidos. Como por exemplo

“ola mundo”

byte[] b = new byte[3];

data.read(b);

for() {

System.out.print(b[i] + " " );

}



Acima ele vai imprimir o valor em bytes de ola e o data.read(b) vai retornar 3

Se você ficar a mesma coisa acima mas usar o array de bytes de 100 posições, o método read(b) vai retornar 9, mas seu for vai rodar 100 vezes. Talvez você esteja meio confuso com a ideia de referência…

Quando eu passo ‘b’ para o método read ele está passando a referência ao objeto do tipo array que foi criado, e o método read vai adicionar valores a este objeto referênciado por ‘b’

De uma olhada na API da classe DataInputStream
http://java.sun.com/j2se/1.4.2/docs/api/java/io/DataInputStream.html

Em expecial no método read(byte[])
http://java.sun.com/j2se/1.4.2/docs/api/java/io/DataInputStream.html#read(byte[])

P

Entendi. então ele passa como referencia a variavel setada… e que eu num sabia que ele passava como referencia… =/ mais agora que sei fica mais facil =)

Bem fiz o teste e funfo legal…

Mais me diz uma coisa… Eu vou ser obrigado a criar o Loop para recuperar esses dados num tem alguma coisa que me retorne por exemplo um toString da vida?

BrunoBastosPJ

new String(byte[])

Construtor da classe String que recebe um array de bytes e tranforma para String :wink:

P

Show… valeu veio… assim tou conseguindo já tirar varias duvidas ao mesmo tempo… com o new String() que vc me passo já quebro algumas duvidas minhas… valeu…

Do resto funfo legal… fiz os testes aqui e tals… o negocio é aprender… tou estudando muito quero aprender de vez o java. e como objetivo eu estou criando um sistema uma engine. o MUGEN pois para criar algo assim eu terei varias barreiras e com essas barreiras eu irei aprovundar mais no mundo java . e estou gostando antes eu tinha um pouco de preconceito contra o java mais agora mudei vi que é show de bola essa linguagem. então quero estudar ela e ajudar a comunidade para quem quer aprender…

P

Será que podem me ajudar a ler esse arquivo ae ? pois tou apanhando muito e num estou conseguindo fazer ler como tem que ser lido…

Ai se alguem me ajudar ficar mais facil eu entender esse esquema de leitura de arquivos binários…

Criado 6 de agosto de 2007
Ultima resposta 7 de ago. de 2007
Respostas 11
Participantes 2