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

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 “,” .

[code]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;
}

[/code]

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?

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

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?

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

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?

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

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.

[quote=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.[/quote]

Faço minhas as palavras do Entanglement.

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!

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

@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.

Pode ser qualquer objeto.

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;


}

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{  

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

Eternamente grato.

Obrigado mesmo.

De nada!