彻底搞懂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的具体实现类传进去就可以了.起到修饰的功能; 这就是装饰模式的精髓.

 

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