在Java使用BufferedInputStream
及BufferedOutputStream
讀取及寫出檔案,範例如下
public class Main {
public static void main(String[] args) {
try (
FileInputStream fis = new FileInputStream(new File("D:\\default.png")); // 要讀取的檔案位置
BufferedInputStream bis = new BufferedInputStream(fis); // 以緩衝串流讀取
OutputStream os = new FileOutputStream("D:\\default2.png"); // 要寫出的檔案位置
BufferedOutputStream bos = new BufferedOutputStream(os); // 以緩衝串流寫出
) {
byte[] buffer = new byte[1024]; // 設定緩衝大小
while (bis.read(buffer) != -1) { // 依設定的緩衝大小讀取檔案
bos.write(buffer); // 將資料寫入緩衝
}
bos.flush(); // 將緩衝區資料寫出
} catch (IOException e) {
e.printStackTrace();
}
}
}
BufferedInputStream
會將檔案先讀取到緩衝區中。呼叫read()
時,會從緩衝區中讀取,當緩衝區資料的被讀完之後,才會再次讀取檔案並填入緩衝區,如此反覆,直到讀取完檔案。
BufferedOutputStream
的每一次write()
其實是將內容寫入byte[]緩衝區,當緩衝容量到達上限時,才會將資料寫到磁碟中。而另一種觸發磁碟寫入的辦法就是呼叫flush()
了。
BufferedOutputStream
在close()
時會自動flush;在不調用close()
的情況下,如此時緩衝區未滿,但又需要把緩衝區的內容寫出時,就需要調用flush()
。
BufferedInputStream
,BufferedOutputStream
並沒有改變來源InputStream
或OutputStream
的行為,讀入或寫出時的動作還是由InputStream
,OutputStream
負責,BufferedInputStream
,BufferedOutputStream
只是在這之前動態的為它們加上一些功能,例如緩衝區功能。Java IO就是典型的裝飾者模式(Decorator Pattern)的應用。
參考:
沒有留言:
張貼留言