Colocando Array de Bytes num Text File de uma forma mais rápida. [?]

15 respostas
G

Galera eu tenho o seguinte código

Ele realmente faz o que eu quero.

E o que eu quero é gravar uma array de bytes num arquivo de texto.

Mas o problema é que as vezes o byte[] tem mais de 100.000 ítens no array, e fazendo o Loop com FOR
pra atingir todos os bytes do array demora muito e ainda mais que normalmente são muitos arquivos bytes.

E depois que eu gravo no arquivo de texto dividindo por 2 vírgulas ( ,, ) , Eu leio o arquivo byte e crio o arquivo byte novamente através do arquivo de texto dando SPLIT por 2 vírgulas.
Ele funciona tudo perfeitamente, mas o problema é a demora mesmo. Eu queria alguma forma mais efetiva.
O que eu tenho em mente no momento é ele converter diretamente um array de bytes para uma String dividindo por ",,"
exatamente como está descrito no código abaixo.

Pois o problema maior é pra criar o arquivo pelo fato de ele fazer um LOOP pra criar a String dividindo por pelas duplas vírgulas, na hora de ler é mais rápido.

Alguem tem alguma solução?

Esse é a primeira parte do código onde ele pega o arquivo Byte e cria uma String separando cada byte do array por ",," .

public String puxando_string_imagem(byte[] byte_enviado){
                   StringBuilder bytes_imagem_builder = new StringBuilder();

            



                    bytes_imagem_builder.append(byte_enviado[0]);

                    for(int i2 = 1; i2 < byte_enviado.length; i2++){
                        bytes_imagem_builder.append(",,");
                        bytes_imagem_builder.append(byte_enviado[i2]);
                    }

                    String fromStringBuildToString = bytes_imagem_builder.toString();
                    return fromStringBuildToString;
    }

Esse é o segundo código onde ele escreve num arquivo de texto a String que está com os bytes divididos por 2 vírgulas.

try{
FileWriter file = new FileWriter("C:\\arquivo.txt");

imagemDAO imgDAO = new imagemDAO();
imagem img = imgDAO.getBuscarImagemPeloID(1);

file.write(puxando_string_imagem( img.getImagem() ));
file.close();

}catch(Exception e){
   e.printStackTrace();
}

E essa é a terceira parte, o código ele pega do arquivo de texto a String dividida por ",," e transforma num array de bytes novamente para ser inserido ao banco de dados.

try{


File file = new File(file_param);


        FileReader file_read = new FileReader(file);

        BufferedReader bf_reader = new BufferedReader(file_read);

        String linha;

        while((linha = bf_reader.readLine()) != null){

                String bytes_imagem[] = linha.split(",,");

                imagemDAO imgDAO = new imagemDAO();
                imagem img = new imagem();


                byte[] byte_imagem = new byte[bytes_imagem7.length];

                for(int i2 = 0; i2 < bytes_imagem7.length; i2++){

                    byte_imagem[i2] = Byte.parseByte(bytes_imagem7[i2]);
                }


                img.setImagem7(byte_imagem);
 

            }catch(Exception e){
                img.setImagem7(null);

            }

try{
            imgDAO.adicionar(img);
}catch(Exception e){
          e.printStackTrace();
}

       }

Lembrando que no banco de dados a coluna está em BLOB. Utilizo O MySQL.

Alguem tem uma forma mais rápida?

15 Respostas

V

Peraí, para que você coloca bytes em formato .txt mesmo?

G

Esses são os bytes de uma imagem.

Por que depois eu quero pegar esses bytes e colocar no banco de dados.

Para então utilizar como uma imagem posteriormente no programa.

Lembrando que esses bytes tbm as vezes são videos e arquivos. Portanto são MUITOSS bytes :wink:

Alguem tem uma forma mais rápida de executar essa ação?

E

Grave esses bytes como bytes mesmo.
É muito, muito mais eficiente que gravá-los como números.
Aprenda sobre campos BLOB.

G

Mas o problema não é na hora de salvar no banco de dados não, o campo blob tá sendo muito efetivo, bem rápido mesmo.

Na hora de salvar no banco de dados, tá super tranquilo.

o que eu quero de fato é tentar converter essa array de bytes para uma String dividindo por 2 vírgulas como mostra o código sem precisar passar pelo FOR, pois está deixando o processo mais lento.

Obrigado aí! Alguem mais?

V

Ok, mas ainda não entendi pq tem que virar texto. Pq não grava um arquivo binário mesmo?

E

Por exemplo, digamos que você tenha um array de 100K. Se você for fazer essa coisa que você está fazendo, vai criar um array de pelo menos 400K.

O jeito mais otimizado de criar um arquivo texto com bytes é você converter para Base-64; isso irá converter um array de 100K para um arquivo de 100K / 3 * 4 = 134 KB. Mesmo assim eu não recomendaria efetuar tal conversão.

V

entanglement:
Por exemplo, digamos que você tenha um array de 100K. Se você for fazer essa coisa que você está fazendo, vai criar um array de pelo menos 400K.

O jeito mais otimizado de criar um arquivo texto com bytes é você converter para Base-64; isso irá converter um array de 100K para um arquivo de 100K / 3 * 4 = 134 KB. Mesmo assim eu não recomendaria efetuar tal conversão.

Faço minhas as palavras do Entanglement.

G

Então eu vou deixar o campo do banco de dados de BLOB para Bytes.

@ViniGodoy
Vini Eu tenho que gravar num texto, devido a algumas razões internas do meu programa.

@entanglement

o Base64 eu nunca utilizei, se puder me mostrar algum exemplo, ficaria grato,
E com o base64 o que vai mudar? eu vou poder colocar num arquivo de texto normalmente? Vai ser um array de bytes normalmente?
Obrigado ai!

P

Rapaz… da uma olhada nesse tópico.

Ele mostra como você grava seus objetos em arquivo.

Pode te ajudar.

http://www.guj.com.br/posts/list/145722.java

G

@PabloSaraiva.

Isso parece ser perfeito pra mim cara.

Só tenho uma dúvida, ele grava qualquer tipo de dado dentro do Objeto? Incluindo Bytes?

Vlw mesmo. O que vc chamaria de desvantagem desse sistema? Obrigado.

P

Pode ser qualquer objeto.

G

Cara acabei de testar da sua forma:

Mas dá um erro:

java.io.NotSerializableException: vestibular.questao

Aonde e o que seria esse erro?

public boolean dataExport_questoes(int com_id, int[] array) throws Exception{

  try {
            clienteDAO cli_dao = new clienteDAO();



            ArrayList <cliente> cli = cli_dao.buscarClientesBackup(com_id, array);



                     ObjectOutputStream out;
            


                out = new ObjectOutputStream(new FileOutputStream(new zip().getExtraction_directory()));

                instDAO inst_dao = new instDAO();
                matDAO mat_dao = new matDAO();
                assDAO ass_dao = new assDAO();
                for(int i = 0; i < cli.size(); i++){

                        String ass_string = "";
                        if(cli.get(i).getAss() != null || !cli.get(i).getAss().trim().isEmpty()){
                        String[] array_ass= cli.get(i).getAss().split(";;");

                        for(int i2 = 0; i2 < array_ass.length; i2++){
                            try{
                            if(i2 != 0) ass_string += ";;";
                            ass_string += ass_dao.buscar(Integer.parseInt(array_ass[i2])).getNome();
                            }catch(Exception e){
                                ass_string = "";
                           }

                         }

                        }else{
                                ass_string = "";

                        }

                cli.get(i).inst_string = inst_dao.buscar(cli.get(i).getInst()).getNome();
                cli.get(i).mat_string = mat_dao.buscar(cli.get(i).getMat()).getNome();
                cli.get(i).setAss(ass_string);

                if(com_id == 0) {
                    cli.get(i).setId(0);
                }

                out.writeObject(cli.get(i));
                }
                out.close();
            


}catch(Exception e){
return false;
}

return true;


}
P

A classe que você quer persistir tem que implementar a interface Serializable

# public boolean dataExport_questoes(int com_id, int[] array) implements Serializable throws Exception{
G

pow cara perfeitamente colocado.
Muito bom esse código, me ajudou pra caramba.

Eternamente grato.

Obrigado mesmo.

P

De nada!

Criado 27 de novembro de 2009
Ultima resposta 28 de nov. de 2009
Respostas 15
Participantes 4