InputStream類available和read方法讀取流數據不全?


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();
    }

有時也不能只使用系統自動的方法,容易掉坑。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM