• NIO教程笔记


    NIO操作文件部分详解

    NIO——New IO,也可以理解为非阻塞IO(Non Blocking IO)。可以替代旧IO,更高效的支持读写(文件读写,网络读写)。但文件操作都是阻塞的。学习NIO首先要了解缓冲区(Buffer),通道(Channel)。

    一.缓冲区(七种类型)——专门用于存取各种基本类型数据(除Boolean)的地方。(如果已经了解,请点击这里)

    1.缓冲区的类型有ByteBuffer,ShortBuffer,IntBuffer,LongBuffer,DoubleBuffer,FloatBuffer,CharBuffer用于存储不同类型的数据。通过xxBuffer.allocate()分配空间

    2.缓冲区的几个重要属性:

      (1).private int limit——缓冲区中数据的界限,即limit之后的数据不会读取

      (2).private int position = 0——缓冲区中当前操作数据的位置。

      (3).private int capacity——缓冲区的最大容量,不会改变(就像数组初始化大小后不会改变一个道理)。

      (4).private int mark = -1——可标记position的位置,通过reset()回到mark位置。

    3.xxBuffer的几个重要方法:

      (1).put();向缓冲区写数据。

      (2).get();从缓冲区读数据。

      (3).rewind();重复读取数据。

      (4).clear();清除数据(非抹除数据,只是重置limit,position,capacity的值,原数据依然存在)。

    3.举例:
      ByteBuffer bf = ByteBuffer.allocate(10);
      此时limit,position ,capacity的数值如图所示。

      

        bf.put("abcde".getBytes());后各个数值如下。(写入数据)

        

        bf.flip();后各个数值如下(flip函数为切换模式,从写模式切换到读模式)。

        

    二、通道(Channel)(如果已经了解,请点击这里)

    通道负责双向传输缓冲区的数据(传统的IO是单向的,reader读,writer写),通过缓冲区flip()来切换读、写模式。在Java NIO中,负责缓冲区中数据传输,Channel本身不存储数据,因此需要配合缓冲区进行传输。

    能够获得channel的方式:

    本地IO:FileInputStream FileOutputStream RandomAccessFile

    网络IO: Socket ServerSocket DatagramSocket

    三、代码展示

    File file = new File();
    Charset utfEncode = Charset.forName("UTF-8");
    CharsetDecoder utfDecoder = utfEncode.newDecoder();

    ByteBuffer buff = ByteBuffer.allocate((int) file.length());
    CharBuffer charbuff = CharBuffer.allocate((int) file.length());
    FileInputStream fis = null;
    FileChannel channel = null;
    StringBuilder context = new StringBuilder();

    try {
    //创建流
    fis = new FileInputStream(file);
    //获取channel
    channel = fis.getChannel();

    int count = channel.read(buff);

    while(count > -1) {
    buff.flip();
    count = channel.read(buff);
    }

    while(buff.hasRemaining()) {
    utfDecoder.decode(buff, charbuff, false);
    charbuff.flip();
    context.append(charbuff);
    }
    System.out.println(context);
    } catch (IOException e) {
    e.printStackTrace();
    }finally {
    if(fis != null) {
    try {
    buff.clear();
    buff = null;
    fis.close();
    channel.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }

  • 相关阅读:
    智能移动机器人背后蕴含的技术——激光雷达
    Kalman Filters
    Fiddler抓HttpClient的包
    VSCode开发WebApi EFCore的坑
    WPF之小米Logo超圆角的实现
    windows react打包发布
    jenkins in docker踩坑汇总
    Using ML.NET in Jupyter notebooks 在jupyter notebook中使用ML.NET ——No design time or full build available
    【Linux知识点】CentOS7 更换阿里云源
    【Golang 报错】exec gcc executable file not found in %PATH%
  • 原文地址:https://www.cnblogs.com/chxwkx/p/10385780.html
Copyright © 2020-2023  润新知