Olá desenvolvedores, neste tutorial converteremos o InputStream em um array de bytes para podermos manipulá-lo no sistema. Em “UPLOAD: ADICIONANDO CAMPO A TELA” criamos no ManagedBean um atributo auxiliar que receberá um arquivo de upload de forma temporária. Este arquivo temporário é o InputStream que está conectado a uma fonte de dados.
Não de forma literal, mas, stream significa “fluxo de dados”, logo, podemos entender InputStream como entrada para um fluxo de dados, seja de que tipo for, mas a ideia central aqui é que o InputStream nos permite ler este fluxo de dado em byte. No entanto, é preciso, antes, convertê-lo em um Array de bytes.
MÉTODO GETBYTE()
As classes que utilizaremos para a manipulação da imagem não aceitam o InputStream de forma direta, por isso a necessidade da conversão. No PessoaBean crie o método getByte que como parâmetro receberá o InputStream.
O método deverá implementar três variáveis, uma variável de controle, uma variável para armazenar o tamanho do arquivo, cujo valor padrão em 1024, e uma variável por meio da qual o fluxo será iniciado.
int len;
int size = 1024;
int[] buf = null;
No entanto, pode acontecer do InputSream ser uma instância de um ByteArrayInputStream, isto é, conter um buffer interno que contém bytes que podem ser lidos do fluxo. A classe ByteArrayInputStream permite que um buffer na memória seja usado como um InputStream. A fonte de entrada é uma matriz de bytes.
Desse modo, se isso ocorrer, declaremos o tamanho padrão como disponível, fazendo com que a variável buf receba um novo tamanho de 1024, e a variável de controle determinaremos que no buffer o tamanho a ser escrito vai de zero ao tamanho do arquivo.
CONVERSÃO
Mas se não, se o InputSream não for uma instância de um ByteArrayInputStream, o que é o mais provável que aconteça, implementaremos para o arquivo por meio de um ByteArrayOutputStream uma saída em forma de bytes. Com esta classe um buffer é criado na memória e todos os dados enviados para o fluxo são armazenados neste buffer.
Em outras palavras, a classe ByteArrayOutputStream implementa um fluxo de saída no qual os dados são gravados em uma matriz de bytes. Onde o buf receberá um novo byte de 1024.
E ainda dentro da estrutura de decisão “else”, implementaremos uma condição que verificará o tamanho do arquivo recebido, o InputStream, e o lerá linha a linha escrevendo no arquivo de saída “bos”. Assim, ao mesmo tempo em que o arquivo é lido, ele deverá ser adicionado a variável de controle.
Quando esta leitura do arquivo for finalizada, o arquivo de saída será convertido em um array de bytes e adicionado a variável buf.
Ao final retornaremos o buf.
return buf;
EM POUCAS PALAVRAS
É uma implementação um pouco complexa para ser entendida, principalmente se você é um iniciante em programação, no entanto, transformar o InputStream em um array de bytes é importante para a manipulação das classes que ainda serão implementadas. E posso assegurar que esta conversão deverá ser feita em 90% das vezes em que você trabalhar com um InputStrream.