【Java回顾】Day7 Java IO|分类(传输方式,数据操作)|零拷贝和NIO

embedded/2025/1/19 12:30:00/

# Java IO 知识体系

请添加图片描述

IO-分类(传输,操作)

传输方式

  • 字节流
    请添加图片描述

  • 字符流

  • 请添加图片描述

  • 字节流和字符流的区别

    • 字节流读取单个字节,字符流读取单个字符
    • 字节流来处理二进制文件(图片,MP3,视频文件),字符流(文本文件(特殊的二进制文件,使用某种编码,人可以阅读))
    • 字节流给计算机处理的,字符流给人看的。
  • 字节转字符Input/OutputStreamReader/Writer

    • 编码是将字节转字符,解码是将字符转字节

数据操作

  • 文件(file)
  • 数组([])
  • 管道操作
  • 基本数据类型
  • 缓冲操作
  • 打印
  • 对象序列化反序列化
  • 转换

请添加图片描述

零拷贝和NIO概述

NIO

  • 参考:https://javaguide.cn/java/io/io-model.html#nio-non-blocking-new-i-o

  • NIO是IO多路复用模型

    • 请添加图片描述

    • 线程首先发起调用,询问内核数据是否准备就绪。等准备就绪后,用户线程再发起read调用(数据从内核空间->用户空间)是阻塞的。

      • select调用,支持一次查询多个系统调用的可用状态,几乎所有的操作系统都支持。
      • epoll调用,linux 2.6内核,select调用的增强版本,优化IO执行效率
  • NIO中的多路复用器selector
    *

    • 请添加图片描述
  • 在高并发和高延迟的环境,适合用NIO提交效率。

  • 组成部分(3个)

    • Buffer缓冲区:读写。读:从Channel到buffer;写:从buffer到Channel。

    • Channel通道:双向可读可写的数据传输通道,实现数据的输入和输出。

    • Selector选择器:一个线程处理多个Channel,基于事件驱动的I/O多路复用模型。多个channel由selector来分配线程处理事件

    • 请添加图片描述

  • 详解

    • Buffer,BIO是缓冲流,NIO是缓冲区

      • 默认是写模式,flip()切换到读模式;clear()或compact()切换到写模式

      • 核心代码

        • 用静态方法创建,CharBuffer buffer = CharBuffer.allocate(8);
        • put写数据,buffer.put(‘a’).put(‘b’).put(‘c’);
        • get读数据,while (buffer.hasRemaining()) {
          System.out.print(buffer.get());
          }
        • 写→读,buffer.flip();
        • 读→写,buffer.clear();
      • import java.nio.*;public class CharBufferDemo {public static void main(String[] args) {// 分配一个容量为8的CharBufferCharBuffer buffer = CharBuffer.allocate(8);System.out.println("初始状态:");printState(buffer);// 向buffer写入3个字符buffer.put('a').put('b').put('c');System.out.println("写入3个字符后的状态:");printState(buffer);// 调用flip()方法,准备读取buffer中的数据,将 position 置 0,limit 的置 3buffer.flip();System.out.println("调用flip()方法后的状态:");printState(buffer);// 读取字符while (buffer.hasRemaining()) {System.out.print(buffer.get());}// 调用clear()方法,清空缓冲区,将 position 的值置为 0,将 limit 的值置为 capacity 的值buffer.clear();System.out.println("调用clear()方法后的状态:");printState(buffer);}// 打印buffer的capacity、limit、position、mark的位置private static void printState(CharBuffer buffer) {System.out.print("capacity: " + buffer.capacity());System.out.print(", limit: " + buffer.limit());System.out.print(", position: " + buffer.position());System.out.print(", mark 开始读取的字符: " + buffer.mark());System.out.println("\n");}
        }
        
      • 请添加图片描述

    • Channel 全双工

      • 常用通道

        • FileChannel 文件访问通道
        • SocketChannel,ServerSocketChannel TCP通信通道
        • DatagramChannl UDP通信通道
      • 核心方法

        • 读,读并写入到Buffer中
        • 写,将buffer数据写入channel中
      • RandomAccessFile reader = new RandomAccessFile("/Users/guide/Documents/test_read.in", "r"))
        FileChannel channel = reader.getChannel();//得到一个channel
        ByteBuffer buffer = ByteBuffer.allocate(1024);//字节缓冲区buffer
        channel.read(buffer);//读
        
    • Selector

      • 请添加图片描述

      • **epoll()**一个多路复用器Selector可以同时轮询多个Channel,由于JDK使用了epoll()代替select实现,因此没有最大连接句柄1024/2048的限制。可以连接成千上万的客户端

      • 监听事件类型

        • SelectionKey.OP_ACCPET 通道接受连接的事件,用于ServerSocketChannel
        • SelectionKey.OP_CONNECT 完成连接的事件,SocketChannel
        • SelectionKey.OP_READ 通道准备好进行读取的事件,有数据可读
        • SelectionKey.OP_WRITE,通道准备好写入的事件,写入数据

NIO零拷贝

  • 解决操作系统在处理I/O操作时频繁复制数据的问题

  • 零拷贝:执行IO操作时,CPU不需要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及CPU的拷贝时间

  • 请添加图片描述

  • 必备2次DMA(Direct memory access),依赖硬件完成,零拷贝是减少了CPU拷贝及上下文切换

  • Java对零拷贝的支持

    • MappedByteBuffer
    • FileChannel
    • S请添加图片描述

IO-分类(传输,操作)

传输方式

  • 字节流
    请添加图片描述

  • 字符流
    请添加图片描述

  • 字节流和字符流的区别

    • 字节流读取单个字节,字符流读取单个字符
    • 字节流来处理二进制文件(图片,MP3,视频文件),字符流(文本文件(特殊的二进制文件,使用某种编码,人可以阅读))
    • 字节流给计算机处理的,字符流给人看的。
  • 字节转字符Input/OutputStreamReader/Writer

    • 编码是将字节转字符,解码是将字符转字节

数据操作

  • 文件(file)
  • 数组([])
  • 管道操作
  • 基本数据类型
  • 缓冲操作
  • 打印
  • 对象序列化反序列化
  • 转换

请添加图片描述

零拷贝和NIO概述

NIO

  • 参考:https://javaguide.cn/java/io/io-model.html#nio-non-blocking-new-i-o

  • NIO是IO多路复用模型
    *

    • 请添加图片描述

    • 线程首先发起调用,询问内核数据是否准备就绪。等准备就绪后,用户线程再发起read调用(数据从内核空间->用户空间)是阻塞的。

      • select调用,支持一次查询多个系统调用的可用状态,几乎所有的操作系统都支持。
      • epoll调用,linux 2.6内核,select调用的增强版本,优化IO执行效率
  • NIO中的多路复用器selector
    *

    • 请添加图片描述
  • 在高并发和高延迟的环境,适合用NIO提交效率。

  • 组成部分(3个)

    • Buffer缓冲区:读写。读:从Channel到buffer;写:从buffer到Channel。
    • Channel通道:双向可读可写的数据传输通道,实现数据的输入和输出。
    • Selector选择器:一个线程处理多个Channel,基于事件驱动的I/O多路复用模型。多个channel由selector来分配线程处理事件
    • 请添加图片描述
  • 详解

    • Buffer,BIO是缓冲流,NIO是缓冲区

      • 默认是写模式,flip()切换到读模式;clear()或compact()切换到写模式

      • 核心代码

        • 用静态方法创建,CharBuffer buffer = CharBuffer.allocate(8);
        • put写数据,buffer.put(‘a’).put(‘b’).put(‘c’);
        • get读数据,while (buffer.hasRemaining()) {
          System.out.print(buffer.get());
          }
        • 写→读,buffer.flip();
        • 读→写,buffer.clear();
      • import java.nio.*;public class CharBufferDemo {public static void main(String[] args) {// 分配一个容量为8的CharBufferCharBuffer buffer = CharBuffer.allocate(8);System.out.println("初始状态:");printState(buffer);// 向buffer写入3个字符buffer.put('a').put('b').put('c');System.out.println("写入3个字符后的状态:");printState(buffer);// 调用flip()方法,准备读取buffer中的数据,将 position 置 0,limit 的置 3buffer.flip();System.out.println("调用flip()方法后的状态:");printState(buffer);// 读取字符while (buffer.hasRemaining()) {System.out.print(buffer.get());}// 调用clear()方法,清空缓冲区,将 position 的值置为 0,将 limit 的值置为 capacity 的值buffer.clear();System.out.println("调用clear()方法后的状态:");printState(buffer);}// 打印buffer的capacity、limit、position、mark的位置private static void printState(CharBuffer buffer) {System.out.print("capacity: " + buffer.capacity());System.out.print(", limit: " + buffer.limit());System.out.print(", position: " + buffer.position());System.out.print(", mark 开始读取的字符: " + buffer.mark());System.out.println("\n");}
        }
        
      • 请添加图片描述

    • Channel 全双工

      • 常用通道

        • FileChannel 文件访问通道
        • SocketChannel,ServerSocketChannel TCP通信通道
        • DatagramChannl UDP通信通道
      • 核心方法

        • 读,读并写入到Buffer中
        • 写,将buffer数据写入channel中
      • RandomAccessFile reader = new RandomAccessFile("/Users/guide/Documents/test_read.in", "r"))
        FileChannel channel = reader.getChannel();//得到一个channel
        ByteBuffer buffer = ByteBuffer.allocate(1024);//字节缓冲区buffer
        channel.read(buffer);//读
        
    • Selector

      请添加图片描述

      • **epoll()**一个多路复用器Selector可以同时轮询多个Channel,由于JDK使用了epoll()代替select实现,因此没有最大连接句柄1024/2048的限制。可以连接成千上万的客户端
      • 监听事件类型
        • SelectionKey.OP_ACCPET 通道接受连接的事件,用于ServerSocketChannel
        • SelectionKey.OP_CONNECT 完成连接的事件,SocketChannel
        • SelectionKey.OP_READ 通道准备好进行读取的事件,有数据可读
        • SelectionKey.OP_WRITE,通道准备好写入的事件,写入数据

NIO零拷贝

  • 解决操作系统在处理I/O操作时频繁复制数据的问题

  • 零拷贝:执行IO操作时,CPU不需要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及CPU的拷贝时间

  • 请添加图片描述

  • 必备2次DMA(Direct memory access),依赖硬件完成,零拷贝是减少了CPU拷贝及上下文切换

  • Java对零拷贝的支持

    • MappedByteBuffer

    • FileChannel

    • 请添加图片描述


http://www.ppmy.cn/embedded/155222.html

相关文章

linux分配磁盘空间命令

使用命令lsblk查询linux磁盘空间时,发现空间并没有被分配完 如图,600G,但实际分配了一共199G,剩余500G,我们需要通过命令进行剩余存储的分配。 思路:创建新的分区->更新内核分区表->初始化新分区作…

Harmony OS 5.0.1 模拟器报未开启 Hyper-V解决方法

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员成长那点儿事,希望在成长的路上有你相伴!君志所向,一往无前! 今天在写Harmony NEXT版本的元服务的时候,突然模拟器无法启动了&#xff0…

.Net 学习指南与资料分享

.NET学习资料 .NET学习资料 .NET学习资料 在当今数字化时代,软件开发领域蓬勃发展,.NET 作为微软推出的强大开发平台,凭借其出色的性能、跨平台特性以及丰富的生态系统,在企业级应用、Web 应用、移动应用等众多领域都有着广泛的…

2025.1.16——七、HardSQL 报错注入

题目来源:buuctf [极客大挑战 2-19]HardSQL 目录 一、打开靶机,分析已知信息 二、手工注入解题 step 1:判断注入类型 step 2:查过滤字符 step 3:()和like绕过过滤 step 4:进行注入 1.用updatexml()…

如何选择正确的电源 IC

电源IC是电源设计中必不可少的部件。本教程将提供为给定应用选择适当 IC 的步骤。它区分了三种常见的由直流电压供电的电源 IC:线性稳压器、开关稳压器和电荷泵。还提供了更的教程和主题的链接。 电源IC是电源设计中必不可少的部件。本教程将提供为给定应用选择适当…

网络安全---CMS指纹信息实战

CMS简介 CMS(Content Management System)指的是内容管理系统,如WordPress、Joomla等。CMS系统非常常见,几乎所有大型网站都使用CMS来管理其网站的内容。由于常见CMS的漏洞较多,因此黑客将不断尝试利用这些漏洞攻击CMS…

深入浅出JSON:数据交换的轻量级解决方案

在现代Web开发中,数据交换是前后端通信的核心。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁、易读、易解析的特点,成为了前后端数据交互的首选格式。本文将详细介绍JSON的定义、数据格式、…

重拾Python学习,先从把python删除开始。。。

自己折腾就是不行啊,屡战屡败,最近终于找到前辈教我 第一步 删除Python 先把前阵子折腾的WSL和VScode删掉。还是得用spyder,跟matlab最像,也最容易入手。 从VScode上搞python,最后安装到appdata上,安装插…