1.問題描述
需要將流InputStream轉換為byte[]數組,定義的方法如下:
/** * 流轉字節數組 * * @param in * @return * @throws IOException */ public static byte[] streamToByteArray(InputStream in) throws IOException { ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buffer = new byte[(int) in.available()]; in.read(buffer); in.close(); return buffer; }
在對文件進行轉換並保存到本地時,發現文件不完整或內容錯誤。
2.原因分析
從代碼中可以看出,在讀物流時調用的是available方法,點擊進入其源碼發現其返回的是當前流可用長度(估計值),不是流的總長度。而在read方法讀取流中數據到buffer中,但讀取長度為1至buffer.length,若流結束或遇到異常則返回-1。也就是說當實際文件的長度超過此估計可用長度時也不會繼續讀,而是結束讀取。從而導致讀取的流並不完整。
3.解決方案
不能使用available方法,那就需要循環去讀取流,直到讀取完成,修改的代碼如下:
public static byte[] streamToByteArray(InputStream in) throws IOException { ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buffer = new byte[4096]; int n; while (-1 != (n = in.read(buffer))) { output.write(buffer, 0, n); } return output.toByteArray(); }
有時也不能只使用系統自動的方法,容易掉坑。