Pegar byte array do OutputStream

Boa noite tenho o trecho de código para download:

try (final InputStream stream = response.getInputStream();
       final OutputStream outputStream = Files.newOutputStream(Paths.get(objectName))) {
     byte[] buf = new byte[8192];
     int bytesRead;
     while ((bytesRead = stream.read(buf)) > 0) {
     outputStream.write(buf, 0, bytesRead);
     }
}

Funciona bem no sentido de pegar o arquivo e criar um File do mesmo, mas tenho interesse em pegar o byte[] desse arquivo vindo do OutputStream. Tentei desta forma, mas sem sucesso:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.writeTo(outputStream);
baos.toByteArray();

Alguém saberia me informar por que pelo baos não funciona e qual seria a forma correta?

É que você não gravou conteúdo nenum no ByteArrayOutputStream então vai retornar um array de bytes vazio.
:man_shrugging:

Faça assim:

try (final InputStream stream = response.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
    byte[] buf = new byte[8192];
    int bytesRead;
    while ((bytesRead = stream.read(buf)) != -1) {
        baos.write(buf, 0, bytesRead);
    }
    byte[] bytes = baos.toByteArray();
}
1 curtida

Bom dia, posso ter entendido errado a forma de conversão do OutputStream, mas quando fiz esse comando outputStream.write(buf, 0, bytesRead) ao debugar o output ele tem bytes nele em uma variável chamada bs. Então tentei fazer a conversão dos bytes para o ByteArrayOutputStream e não funcionou.

Resolvi pegando os bytes do InputStream, mas estava pensando porque pelo OutputStream não funcionava.

Bom, uma dica é sempre ler a documentação de tudo que usa. E a documentação de ByteArrayOutputStream diz que esta classe é um output stream que grava os dados em um array de bytes.

Ou seja, se você escreve em um ByteArrayOutputStream, tudo que foi escrito é gravado neste array de bytes interno. A documentação também diz: “The data can be retrieved using toByteArray() and toString().” - ou seja, para obter os dados que estão no array de bytes interno, use um dos métodos indicados: toByteArray() ou toString().

Então vendo o seu código:

Na primeira linha, vc cria um ByteArrayOutputStream vazio (ou seja, sem nenhum conteúdo, o array de bytes interno dele não tem nada, porque neste momento nada foi escrito nele ainda).

Na segunda linha, vc chama writeTo. Veja na documentação o que este método faz: “Writes the complete contents of this ByteArrayOutputStream to the specified output stream argument”.

Ou seja, este método pega o conteúdo do ByteArrayOutputStream e escreve no outputStream (que no seu caso, é uma stream que está escrevendo no arquivo, já ele foi criado com Files.newOutputStream). Mas como neste momento o ByteArrayOutputStream está vazio (pois seu array de bytes interno não tem nada), então nada será escrito no arquivo.

Por isso que assim não funcionou, pois você está tentando escrever no arquivo, e não ler dele (que parece ser o que vc quer).

1 curtida

Bom dia hugokotsubo, entendi acho que fiz uma pequena/grande confusão aqui, documentação realmente resolvia o problema. Obrigado.