美文网首页
I/O-普通IO与文件IO

I/O-普通IO与文件IO

作者: 麦大大吃不胖 | 来源:发表于2020-11-27 09:58 被阅读0次

by shihang.mai

1. 普通I/O

I/O buffer为什么比普通的FileOutPutStram块:

首先明白,用户态内核态切换需要中断。buffer每8k做一次system call write,而普通的IO是每一次都system call write。比buffer多很多次中断。

2. 文件IO

2.1 bytebuffer

buffer.compact();会压缩剩下的元素

public static void whatByteBuffer(){
        //堆内分配
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        //堆外分配
        //ByteBuffer buffer = ByteBuffer.allocateDirect(1024);


        System.out.println("postition: " + buffer.position());
        System.out.println("limit: " +  buffer.limit());
        System.out.println("capacity: " + buffer.capacity());
        System.out.println("mark: " + buffer);

        buffer.put("123".getBytes());

        System.out.println("-------------put:123......");
        System.out.println("mark: " + buffer);

        buffer.flip();   //读写交替

        System.out.println("-------------flip......");
        System.out.println("mark: " + buffer);

        buffer.get();

        System.out.println("-------------get......");
        System.out.println("mark: " + buffer);

        buffer.compact();

        System.out.println("-------------compact......");
        System.out.println("mark: " + buffer);

        buffer.clear();

        System.out.println("-------------clear......");
        System.out.println("mark: " + buffer);

    }
bytebuffer

2.2 MappedByteBuffer

public static void testRandomAccessFileWrite() throws  Exception {

        RandomAccessFile raf = new RandomAccessFile(path, "rw");

        raf.write("hello mashihang\n".getBytes());
        raf.write("hello yoko\n".getBytes());
        System.out.println("write------------");
        System.in.read();

        raf.seek(4);
        raf.write("ooxx".getBytes());

        System.out.println("seek---------");
        System.in.read();

        FileChannel rafchannel = raf.getChannel();
        //system call mmap 位置:堆外  和文件映射的 byte
        MappedByteBuffer map = rafchannel.map(FileChannel.MapMode.READ_WRITE, 0, 4096);
        /*
         * 不是系统调用  但是数据会到达 内核的pagecache
         * 曾经我们是需要out.write()  这样的系统调用,才能让程序的data 进入内核的pagecache,必须有用户态内核态切换
         */
        map.put("@@@".getBytes());

        System.out.println("map--put--------");
        System.in.read();
        //  flush
      //map.force();



        raf.seek(0);

        ByteBuffer buffer = ByteBuffer.allocate(8192);
//        ByteBuffer buffer = ByteBuffer.allocateDirect(1024);

        rafchannel.read(buffer);   //buffer.put()
        System.out.println(buffer);
        buffer.flip();
        System.out.println(buffer);

        for (int i = 0; i < buffer.limit(); i++) {
            Thread.sleep(200);
            System.out.print(((char)buffer.get(i)));
        }


    }
堆外堆内分配

相关文章

  • I/O-普通IO与文件IO

    普通IO与文件IO by shihang.mai 普通I/O I/O buffer为什么比普通的FileOutPu...

  • 软件架构设计-操作系统

    操作系统 直接IO与缓冲IO 缓冲io又称作标准I/O,大多数文件系统的默认IO操作都是缓冲IO。在linux的缓...

  • 19-io_文件权限掩码_动态库_静态库

    I/O * 标准IO:库 带缓存 通过流FILE * 操作文件 * 文件IO...

  • 2019-06-16 IO文件操作---C语言

    Linux下普通IO文件操作---C语言 普通文件IO总结 FILE结构体 打开文件fopen函数 文件指针名=f...

  • 系统网络50问

    系统网络50问1、标准文件IO与文件IO的区别?答:标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是...

  • 系统网络50问

    系统网络50问1、标准文件IO与文件IO的区别?答:标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是...

  • JavaSE进阶九 IO流一

    1,IO流的概述 IO流,什么是IO? I:Input O:Output 通过IO可以完成硬盘文件的读和写。...

  • 2018-07-03

    Netty实践与NIO原理 一、阻塞IO与非阻塞IO Linux网络IO模型(5种) (1)阻塞IO模型 所有文件...

  • Java学习23:IO流

    什么是IO? I:InputO:Output通过IO可以完成硬盘文件的读和写。 IO流的分类 有多种分类方式:一种...

  • linux I/O5中模型认识

    linux I/O5中模型 引入I/O模型 标准I/O: 缓存 IO 又被称作标准 IO,大多数文件系统的默认 I...

网友评论

      本文标题:I/O-普通IO与文件IO

      本文链接:https://www.haomeiwen.com/subject/xshoiktx.html