Pegar uma quantidade variavel de bytes em um arquivo binário em java?

7 respostas
java
M

Pessoal, como faço para pegar uma quantidade variavel de bytes em um arquivo binário em java?
Tem um arquivo binario desse modo -> int int String . O segundo inteiro me diz a quantidade de bytes que devo ler para pegar a string completa. O código abaixo pega perfeitamente os dois inteiros mas ñ sei como faço para pegar agora string, ñ achei nenhum método dessa classe random acess file que me permita passar a quantidade de bytes que quero ler. Lembrando que no java cada char possui 2 bytes, então o tamanho da string(array de char) convertida em bytes será multiplicado por 2. (faço conversão de string para char e char para array de bytes na criação do arquivo em outro código)

ex: 54 6 pai

System.out.println(r1.readInt()); // retorna 54
System.out.println(r1.readInt()); // retorna 6 tamanho em bytes da string "pai"

public class teste2 
{
    public static void main(String[] args) throws IOException 
   {
        
        RandomAccessFile r1 = new RandomAccessFile("teste.bin","r");
        System.out.println(r1.readInt());
        System.out.println(r1.readInt());
    }
}

7 Respostas

J
RandomAccessFile r1 = new RandomAccessFile("teste.bin","rw");
        r1.writeInt(54);
        r1.writeInt(5);
        r1.writeBytes("jorge");
        
        r1.writeInt(80);
        r1.writeInt(7);
        r1.writeBytes("menezes");
        r1.close();
        
        r1 = new RandomAccessFile("teste.bin","r");
        int primeiro = r1.readInt();
        int segundo  = r1.readInt();
        
        byte[] contem = new byte[segundo];
        int ret = r1.read(contem);
        String frase = new String(contem);
        
        
        System.out.println("--> " + primeiro + " / " + segundo + " / " + frase);
        
        
        primeiro = r1.readInt();
        segundo  = r1.readInt();
        
        contem = new byte[segundo];
        ret = r1.read(contem);
        frase = new String(contem);
        
        System.out.println("--> " + primeiro + " / " + segundo + " / " + frase);

Existem varias formas de obter o conteúdo, caso você desejar podera’ criar um loop e pegar isso de forma variavel.

Bons codigos

M

Muito obrigada j-menezes por compartillhar seu conhecimento! Olha, colocar String frase = new String(contem); não funfou aqui pra mim, ele ñ ta imprimimdo a string depois e tbm não dá nenhum erro.

J
import java.io.FileNotFoundException;

import java.io.RandomAccessFile;

import java.util.logging.Level;

import java.util.logging.Logger;

public class ReadBinary {

public static void main(String[] args)  {        
    
     
    try {
        // aqui ele vai criar o arquivo binario teste2.bin              
        // ***************************************************
        RandomAccessFile r1 = new RandomAccessFile("teste2.bin","rw");
        r1.writeInt(54);
        r1.writeInt(5);
        r1.writeBytes("jorge");
        
        r1.writeInt(80);
        r1.writeInt(7);
        r1.writeBytes("menezes");
        r1.close();
// *** aqui ele vai ler o conteudo do teste2.bin

// *****************************************************

r1 = new RandomAccessFile(teste2.bin,r);

int primeiro = r1.readInt();

int segundo  = r1.readInt();
byte[] contem = new byte[segundo];
        int ret = r1.read(contem);
        String frase = new String(contem);            
        
        System.out.println("--> " + primeiro + " / " + segundo + " / " + frase);
primeiro = r1.readInt();
        segundo  = r1.readInt();
        
        contem = new byte[segundo];
        ret = r1.read(contem);
        frase = new String(contem);
        
        System.out.println("--> " + primeiro + " / " + segundo + " / " + frase);
        
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    
}

}

Resultado

–> 54 / 5 / jorge
–> 80 / 7 / menezes

Em qualquer IDE ou direto funciona legal, bom… eu gosto do NetBeans.

Bons Codigos

M

j-menezes resolvi aqui fazendo isso String frase = new String(contem,“UTF-16”); Obrigada cara vlw mesmo! To usando o eclipse neon no ubuntu não sei se muda alguma coisa. Bons estudos!

P

vc sabe o que isso faz, que mal pergunte?

M

Pelo que entendi na documentação java , esse “UTF-16” diz para o java que tipo de codificação que ele deve fazer, neste caso UTF-16 é um tipo de codificação de caracteres que utiliza 16 bits para representação e o “contem” é um array de bytes da string. O que a linha faz é pegar um array de bytes e criar uma string a partir deste array de bytes.

Onde pesquisei o lance do UTF-16:

Documentação classe string

UTF-16

UTF-16 java

P

otimo. perguntei pq tem gente q acerta codigo na força bruta e depois não entende o motivo de alguns comportamentos.

a maneira pelo qual se estima o tamanho de uma string em utf-8 e utf-16 é diferente. vc pode ter 5 code points ou “letras” mas isso pode ocupar 5 ou 6 ou 10 bytes em utf-8, mas utf-16 é fixo. por outro lado vc tem bytes “inuteis”

Criado 14 de outubro de 2016
Ultima resposta 19 de out. de 2016
Respostas 7
Participantes 3