網頁

2018/11/17

Java IO 使用BufferedInputStream及BufferedOutputStream讀取及寫出檔案。

在Java使用BufferedInputStreamBufferedOutputStream讀取及寫出檔案,範例如下

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()了。

BufferedOutputStreamclose()時會自動flush;在不調用close()的情況下,如此時緩衝區未滿,但又需要把緩衝區的內容寫出時,就需要調用flush()

BufferedInputStreamBufferedOutputStream並沒有改變來源InputStreamOutputStream的行為,讀入或寫出時的動作還是由InputStreamOutputStream負責,BufferedInputStreamBufferedOutputStream只是在這之前動態的為它們加上一些功能,例如緩衝區功能。Java IO就是典型的裝飾者模式(Decorator Pattern)的應用。


參考:

沒有留言:

張貼留言