生成、下載文件總是少一個字節原因之一

前段時間做項目時,碰到一個問題,從網站下載文件時總是少一個字節,導致文件打不開或者打開內容不正確,經過長時間的尋找,終於發現問題所在(原來錯誤代碼):

    InputStream fis = null;
            OutputStream out = null;
            try {
                fis = documentInfoService.downloadFile(fastDfsId);//獲取要下載的文件流
                if(fis==null){
                    Throw new Exception(“文件爲空!”);
                    return null;
                }
                out = new FileOutputStream(new File("路徑"));//
                int b = 0;
                byte[] buffer = new byte[1024];
                while (b != -1) {
                    b = fis.read(buffer);
                    out.write(buffer, 0, b);
                }

                out.flush();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    fis.close();
                    out.close();
                    return null;
                } catch (IOException e) {
                   e.printStackTrace();
                }
            }

大家注意標紅的部分:

此處如果在個人電腦上不論用jetty還是用tomcat運行,都會拋異常,運行到catch中,打印出錯誤信息,文件無法生成;

在服務器環境中,用tomcat時,此處不報錯,即不會進入catch中,不會打印錯誤信息,能生成文件,並且生成的文件是正確的,不少任何東西;用jetty時,此處也不會報錯,不會打印錯誤信息,能生成文件,但是所有生成的文件都會少一個字節,原因在於fis.read(buffer)讀完最後最後的內容後會返回一個-1,並且-1對out.write(buffer, 0, b)起了作用(api中的說明:

如果 bnull,則拋出 NullPointerException

如果 off 爲負,或 len 爲負,或者 off+len 大於數組 b 的長度,則拋出 IndexOutOfBoundsException

),導致文件回退了一個字節,也即生成的文件少一個字節


所以正確的方法改爲:

 while ((b = fis.read(buffer)) != -1) {
                    out.write(buffer, 0, b);
                }

這樣的話就不會最後多循環一次,造成不必要的麻煩

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章