Alguem sabe como pegar o tamanho em bytes de um InputStream?
Tamanho de um InputStream
8 Respostas
Não há como saber, porque uma InputStream pode ter tamanho indefinido (pense em um socket recebendo continuamente dados).
Pois é, mas não teria alguma forma de converter esse InputStream em algo definido que possua um tamanho fixo?
É que estou usando o método setBinaryStream() do PreparedStatement e preciso passar um tamanho para gravar um InputStream e não sei como estipular.
Por que precisaria? Há uma versão que não precisa do comprimento como parâmetro.
setBinaryStream
Nem rola, sou obrigado (normas da empresa) a usar uma versão mais antiga que não tem.
O que eu faria no seu lugar: se eu soubesse que os dados são sempre pequenos, criaria um ByteArrayOutputStream copiaria o seu InputStream para esse ByteArrayOutputStream.
Então usaria toByteArray() para pegar os bytes e então criaria um ByteArrayInputStream para passar para esse setBinaryStream.
Se os dados forem grandes, então jogaria os dados lidos da InputStream em um arquivo temporário (eca) e faria algo parecido com o que disse acima, só que usando um FileInputStream.
Estava olhando aqui no guj mesmo e vi o pessoal falando do método available() da propria InputStream, olhei na documentação, mas não coompreendi muito bem, “Retorna o número de bytes que podem ser lidos ou ignorado”
testei com ele, deu certo, mas não sei a questão de espaço que ele esta alocando no banco, se é o tamanho atual do inputStream, ou o tamanho que ele pode chegar.
o available vai depender da implementacao: num FileInputStream ele vai te dar o numero de bytes que ainda faltam ser lidos com precisao. Ja para um socket, vai dizer quanto voce consegue ler, mas pode ser, e é provavel, que mais bytes estejam chegando da maquina remota!
Hum, bom saber, no meu caso seria um FileInputStream, olhei aqui no banco de dados e ele ficou com o mesmo tamanho do arquivo original, acho que a priori meu problema esta resolvido.
Valeu pela ajuda de vocês…