檔案流關閉順序問題

2021-10-04 17:58:28 字數 1504 閱讀 1002

情景

將一張大小為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:bufferedoutputstreamfileoutputstream對應著同乙個流,故只關閉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...