Byte [] para InputStream ou OutputStream


129

Eu tenho uma coluna de blob na minha tabela de banco de dados, para a qual tenho que usar byte[]no meu programa Java como um mapeamento e, para usar esses dados, tenho que convertê-lo em InputStreamou OutputStream. Mas não sei o que acontece internamente quando faço isso. Alguém pode me explicar brevemente o que está acontecendo quando eu faço essa conversão?


2
O título não deve ser "matriz de bytes ..." ou "matriz de bytes ..." ou "byte [] ..." instaurado por "byte da matriz ..."?
precisa saber é o seguinte

Respostas:


198

Você cria e usa fluxos de E / S da matriz de bytes da seguinte maneira:

byte[] source = ...;
ByteArrayInputStream bis = new ByteArrayInputStream(source);
// read bytes from bis ...

ByteArrayOutputStream bos = new ByteArrayOutputStream();
// write bytes to bos ...
byte[] sink = bos.toByteArray();

Supondo que você esteja usando um driver JDBC que implemente a interface padrão do JDBC Blob (nem todos o fazem), você também pode conectar um InputStreamou OutputStreamum blob usando os métodos getBinaryStreame 1 , e também pode obter e definir os bytes diretamente.setBinaryStream

(Em geral, você deve executar as etapas apropriadas para lidar com quaisquer exceções e fechar fluxos. No entanto, o fechamento bise boso exemplo acima são desnecessários, pois eles não estão associados a nenhum recurso externo; por exemplo, descritores de arquivo, soquetes, conexões com o banco de dados.)

1 - O setBinaryStreammétodo é realmente um getter. Vai saber.


13

Estou assumindo que você quer dizer que 'use' significa leitura, mas o que vou explicar para o caso de leitura pode ser basicamente revertido para o caso de gravação.

então você acaba com um byte []. isso pode representar qualquer tipo de dados que possa precisar de tipos especiais de conversões (caracteres, criptografados etc.). vamos fingir que você deseja gravar esses dados como estão em um arquivo.

Em primeiro lugar, você pode criar um ByteArrayInputStream, que é basicamente um mecanismo para fornecer os bytes a algo em sequência.

você pode criar um FileOutputStream para o arquivo que deseja criar. existem muitos tipos de InputStreams e OutputStreams para diferentes origens e destinos de dados.

Por fim, você escreveria o InputStream no OutputStream. nesse caso, a matriz de bytes seria enviada em sequência para o FileOutputStream para gravação. Para isso, eu recomendo usar IOUtils

byte[] bytes = ...;//
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
FileOutputStream out = new FileOutputStream(new File(...));
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);

e ao contrário

FileInputStream in = new FileInputStream(new File(...));
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
byte[] bytes = out.toByteArray();

se você usar os trechos de código acima, precisará lidar com exceções e eu recomendo que você faça o 'fechamento' em um bloco final.


você não quis dizer - ByteArrayOutputStream out = new ByteArrayOutputStream (); ByteArrayOutputStream out = new ByteArrayInputStream ();
Avihai Marchiano 21/07

CloseQuietly provavelmente deve estar em uma cláusula finalmente.
23714 JustinSU


4

Não há conversão entre InputStream / OutputStream e os bytes com os quais eles estão trabalhando. Eles são feitos para dados binários e apenas leem (ou escrevem) os bytes um a um como estão.

Uma conversão precisa ocorrer quando você deseja passar de byte para char. Então você precisa converter usando um conjunto de caracteres. Isso acontece quando você cria String ou Reader a partir de bytes, criados para dados de caracteres.


1
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )

0

Percebo que minha resposta está muito atrasada para esta pergunta, mas acho que a comunidade gostaria de uma abordagem mais nova para esse problema .


Os buffers circulares não resolvem o problema do OP. Na pergunta, como está escrito, o OP precisa de todo o conteúdo em uma única matriz de bytes.
Stephen C

0
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();

Eu acho que isso é melhor, pois você já possui um OutputStream existente no objeto de resposta. não é necessário criar um novo OutputStream.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.