徹底搞懂IO

 經常問到IO,用到什麼設計模式,手寫IO 讀取 寫入 複製;

 

1. IO是什麼? 爲什麼要這樣操作?

 答: IO是流, 是數據流,字節流, 視頻流,  Java操作這些流式從內核中讀取的, 寫入也是寫到內核中,然後內核再將數據刷到磁盤上的.

  就拿一個socket來的文件流來舉例:

  第一步: 網卡有文件流來的時候, 可以通過事件監聽,去網卡上讀取這些流到內核中, 也可以是內核定時去網卡中取數據到內核中來; 

  第二步: 用戶將這些流從內核態讀到用戶態. 這就是爲什麼要定義 new byte[1024] 這個對象了. 這個時候就會在用戶空間中了.

  第三步: 拿到這些流,我們要幹什麼呢,? 寫入到磁盤上;   FileOutputStream 寫入磁盤;

   fileOutputStream.write() 這個操作是操作內核的東西的, 寫入到內核buffer中, 然後內核 flush到磁盤上;

   

我之前都是背過一段操作數據流的程序,這樣不知道具體怎麼操作的, 但是隻要理解內核的概念, 這些問題就迎刃而解

    public static void fileTest2() throws IOException {

        FileInputStream fileInputStream = new FileInputStream("/Users/IdeaProjects/esign-scf/service/src/test/java/com/finance/platform/esign/service/Test.java");
        FileOutputStream fileOutputStream = new FileOutputStream("/Users/IdeaProjects/esign-scf/service/src/test/java/com/finance/platform/esign/service/aaaa.java");
        byte[] bytes = new byte[50];
        int len = 0;
        while ((len = fileInputStream.read(bytes)) != -1) {
            fileOutputStream.write(bytes, 0, len);
        }
        fileInputStream.close();
        fileOutputStream.close();
    }

按照上面的代碼就能理出這樣的邏輯

下面buffer的實例就是bufferInputStream已經幫我建立好了new byte[];

    public static void main(String[] args) throws IOException {
        InputStream filterInputStream = new BufferedInputStream(new FileInputStream("/Users/IdeaProjects/esign-scf/service/src/test/java/com/finance/platform/esign/service/Test.java"));

        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("/Users/IdeaProjects/esign-scf/service/src/test/java/com/finance/platform/esign/service/aaaa.java"));
        int read;
        while ((read = filterInputStream.read()) != -1) {
            bufferedOutputStream.write(read);
        }
        filterInputStream.close();
        bufferedOutputStream.close();
    }

第二個問題: IO設計中用到裝飾模式,有怎麼修飾的? 修飾了什麼? 起到什麼作用?

裝飾模式有幾個角色

1.抽象類 或者接口  InputStream

2 具體實現類:FilInputstream;

3 裝飾抽象類:  FilterInputStream,  [這個地方也用到了組合模式,將InputStream集成到這個類中]

4 具體裝飾類: BufferInputstream, 這個地方提供緩衝區功能;

 

怎麼修飾的?

這個拿BufferInputstream來說,這個地方在read()方法中加入修飾功能[提供了buffer的功能] 這樣後面要想用這個功能就直接可以將對象InputStream的具體實現類傳進去就可以了.起到修飾的功能; 這就是裝飾模式的精髓.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章