情景
將一張大小為1.5kb的影象檔案從乙個資料夾移動到另乙個資料夾
問題目標資料夾下對應檔案大小為0kb
存在問題的**(簡化版)
file file =
newfile
(uri)
;fileoutputstream fos =
newfileoutputstream()
;bufferedoutputstream bos =
newbufferedoutputstream()
;/**
* some input and output operations.
*/fos.
close()
;bos.
close()
;
即,開啟檔案輸入流,向該輸入流寫入位元組,關閉輸入流
原因先關閉fileoutputstream
再關閉bufferedoutputstream
tips:以上關閉順序還會導致執行bos.close()
時丟擲異常,因為對乙個已經關閉的輸出流執行了close()
正確的順序應該是先關閉bufferedoutputstream
,再關閉fileoutputstream
因為bufferedoutputstream
是對fileoutputstream
的包裝,為其新增了乙個緩衝區,在bufferedoutputstream
關閉時會呼叫自己的flush()
函式,將流緩衝區裡和bufferedoutputstream
緩衝區裡的資料強制刷出;fileoutputstream
關閉時也會將流緩衝區裡的資料刷出,但是它沒辦法刷出bufferedoutputstream
緩衝區中的資料
/**
* bufferedoutputstream的flush()方法
*/public
synchronized
void
flush()
throws ioexception
flushbuffer()
用於刷出bufferedoutputstream
緩衝區資料;out.flush()
用於刷出流緩衝區資料
總結為了確保資料傳輸完整,應先關閉bufferedoutputstream
再關閉fileoutputstream
。
tips:bufferedoutputstream
與fileoutputstream
對應著同乙個流,故只關閉bufferedoutputstream
也是可行的
Java中檔案流的關閉問題
這裡以如下所示的 為例 inputstreamreader in new inputstreamreader new fileinputstream file bufferedreader read new bufferedreader in 當我們讀寫完畢的時候,該如何關閉資料流呢?我在網上找了乙...
SpringMVC檔案上傳關閉流
使用springmvc 檔案上傳時。io的關閉 springmvc提供了files.transferto new file c 12.jpg 內部方法如下 if dest.exists dest.delete 巧妙之處的設計 public void transferto file dest thro...
JAVA I O流的關閉順序有講究沒有?
比如依次 inputstream in new inputstream inputstreamreader reader new inputstreamreader in bufferedreader bufferedreader new bufferedreader reader buffered...