前段時間做項目時,碰到一個問題,從網站下載文件時總是少一個字節,導致文件打不開或者打開內容不正確,經過長時間的尋找,終於發現問題所在(原來錯誤代碼):
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中的說明:
如果 b
爲 null
,則拋出 NullPointerException
。
如果 off
爲負,或 len
爲負,或者
off+len
大於數組 b
的長度,則拋出 IndexOutOfBoundsException
所以正確的方法改爲:
while ((b = fis.read(buffer)) != -1) {
out.write(buffer, 0, b);
}
這樣的話就不會最後多循環一次,造成不必要的麻煩