在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)的應用。
參考:
沒有留言:
張貼留言