首页 > 编程语言 >Java IO

Java IO

时间:2024-08-18 11:51:31浏览次数:8  
标签:Java 数据源 AIO IO 缓冲区 数据 选择器 通道

  1. Java IO流:是用于处理输入和输出操作的机制。可以把它想象成水流,数据就像水一样在程序和外部数据源(如文件、网络连接、控制台等)之间流动。例如,FileInputStream 用于从文件中读取数据,FileOutputStream 用于向文件中写入数据。通过这些流,可以实现对不同数据源和数据目标的读写操作。
  2. Java IO模型:是指 Java 程序处理输入输出的方式和策略。像不同的运输方式,有一直等待货物装完(阻塞 I/O)的,有边等边做其他事(NIO)的,还有交代完就不管了等通知(AIO)的。

1. IO流

1.1. 流的分类

1.1.1. 流的方向

  • 输入流:读入到内存
  • 输出流:从内存读出

1.1.2. 流的内容

  • 字节流: 以字节为单位, 可以读写所有数据,如音视频、图片。
  • 字符流: 以字符为单位, 只能读写文本数据,如文本。

字符流通常需要考虑字符编码,以正确地将字符和字节进行转换。

1.1.3. 流的功能

  • 节点流:从特定数据源读取数据。
  • 处理流:给已有的流特定功能,如BufferedReader
  • 节点流直接跟数据源连接。
  • 处理流(包装流)包装节点流,使用了装饰器模式。
  • 处理流可消除不同流的差异,可以更方便地输入输出,比如增加缓冲区、序列化对象。

1.2. IO缓冲

缓冲输入(出)流(BufferedInput(Output)Stream/BufferedReader(Writer))通过在内存中创建缓冲区来减少与底层数据源或目标的实际交互次数。

  • 读取时,先从数据源读一大块数据到缓冲区中,再从缓冲区慢慢读,读空了,再从数据源读一大块到缓冲区。这样可减少磁盘或网络I/O次数,提高读取效率。
  • 写入数据时,先写到缓冲区,缓冲区填满或手动调用flush方法时,讲缓冲区中的数据一次性写入底层输出目标,从而减少实际的写入次数。

1.3. 总结一下

0a885a2fd0ec4264a19e99a14417b236.png

 上面的表中为了简单,只写了输入的,输出的流与输入是一一对应的(input对应output、reader对应writer)。

几个常用类的区别:

  • DataInputStream读取基本类型(如int、float等);ObjectInputStream读取复杂对象,也就是用于序列化/反序列化的场景。
  • FilterInputStream/FilterReader 可用于数据进行加密、压缩、转换,Buffered的那几个类就是继承了Filter的这些类来实现的。
  • PipedInputStream和PipedReader用于线程间通信。

2. IO模型

2.1. BIO

阻塞 I/O(Blocking I/O)这是最常见和简单的 I/O 模型。在进行输入或输出操作时,线程会被阻塞,直到操作完成。例如,当读取数据时,如果缓冲区没有数据,线程会一直等待直到有数据可读。

上面的IO流基本都属于BIO的范畴。

2.2. NIO

NIO(New Input/Output)即新的输入输出,是同步非阻塞的I/O模型。它基于通道(Channel)和缓冲区(Buffer)进行数据的传输,通过选择器(Selector)来实现一个线程处理多个通道的I/O事件,提高了资源的利用率和程序的并发处理能力。

“同步非阻塞”就好比你去快递站寄快递,你把包裹交给工作人员后,不坐在那里等着,但你需要时不时地询问工作人员包裹是否寄出去了。这就是你在主动轮询结果,虽然没有一直傻等,但还是得自己不断去获取状态。

2.2.1. 通道(Channel)

类似于传统 I/O 中的流,但支持双向传输,并且可以异步地进行读写操作。

它负责在数据源(如文件、网络连接)和程序之间建立连接,并进行数据的传输。

例如:FileChannel 用于文件 I/O,SocketChannel 用于网络套接字的读写。

2.2.2. 缓冲区(Buffer)

用于存储数据的内存区域。数据在通道和程序之间的传递都是通过缓冲区进行的。从通道读数据时,数据会被读到缓冲区中;向通道写数据时,先将数据写入缓冲区,再由缓冲区写入通道。

常见的缓冲区类型有 ByteBuffer、CharBuffer 等。

缓冲区具有一些重要的属性,如容量(capacity)、限制(limit)和位置(position)。通过操作这些属性,可以有效地管理缓冲区中的数据。

2.2.3. 选择器(Selector)

选择器用于监听多个通道的I/O事件(如可读、可写等)。一个选择器可以同时管理多个通道。

当程序向选择器注册通道,并指定感兴趣的事件类型后,选择器会在后台不断轮询这些通道的状态。当某个通道上发生了注册的事件时,选择器会将该通道标记为就绪状态,并返回给程序,程序可对这些通道进行相应I/O 操作。

2.2.4. 它们之间的关系

  • 通道是数据传输的路径,
  • 缓冲区是数据存储的载体,
  • 选择器是管理多个通道的调度器。

例如,在一个网络服务器应用中,可能有多个客户端连接到服务器。服务器可用一个选择器来监听这些连接的通道。当某个客户端发送数据过来,对应的通道变为可读状态,选择器会通知服务器,服务器从该通道读取数据到缓冲区中进行处理。

用一个火车站的例子来类比。

  • 选择器是火车站的调度员。
  • 通道是通往各个城市的铁路。
  • 缓冲区是火车站的候车大厅。
  1. 调度员(选择器)时刻关注每条线路(通道)的状况,如哪条线路上有列车即将进站,哪条线路可以发车。
  2. 当有大量旅客需要乘车时,他们会先在候车大厅(缓冲区)等待。调度员根据铁轨线路的情况,安排旅客从候车大厅通过相应的线路乘车出发。
  3. 有时列车晚点或者线路繁忙,旅客就在候车大厅继续等待,直到调度员通知可以上车。

这样,调度员(选择器)根据铁轨线路(通道)的状态,合理安排候车大厅(缓冲区)里的旅客出行,确保火车站的运输有序高效。

2.3. AIO

AIO(Asynchronous Input/Output)即异步输入输出,是真正意义上的异步I/O模型。在进行I/O操作时,发起操作后立即返回,I/O操作完成后会通过回调函数或其他通知机制告知程序结果,程序无需阻塞等待I/O操作的完成。

一般使用AsynchronousFileChannel、AsynchronousSocketChannel 来实现AIO。

AIO在实际应用中的使用相对较少,因为它的实现相对复杂,在某些场景下,NIO结合线程池等技术也能达到较好的性能效果。Tomcat、Jetty、RabbitMQ、Kafka等都用了NIO,目前我还没有发现哪个常见的中间件用了AIO。

有些比较旧的操作系统和比较老的Java 运行时环境不支持AIO,或没有提供完善的支持。

“异步”就像是你在网上预约了上门取件,填好信息后你就去做自己的事情了。快递员取走包裹并成功寄出后,会给你发个短信通知你,而在这整个过程中,你不需要自己去询问或者查看包裹的寄送状态。

 

标签:Java,数据源,AIO,IO,缓冲区,数据,选择器,通道
From: https://blog.csdn.net/liushuidehao/article/details/141219884

相关文章

  • JavaSocket编程+JDBC实战技术
    一、JavaSocket编程1.1HTTP协议后端原理2.特点同步:就是两个任务执行的过程中,其中一个任务要等另一个任务完成某各阶段性工作才能继续执行,如厨师A炒番茄,将葱花放入锅中,然后需要放入番茄,但是厨师B还没有把番茄切好,厨师A就得等厨师A把番茄切好才能继续,期间处于等待状态。......
  • day23-测试自动化之Appium的滑动和拖拽事件、高级手势ActionChains、手机操作API
    目录一、滑动和拖拽事件    1.1.应用场景    1.2.swipe滑动事件    1.3.scroll滑动事件    1.4.drag_and_drop拖拽事件    1.5.滑动和拖拽事件的选择二、高级手势ActionChains    2.1.应用场景    2.2.使用......
  • java基础概念笔记
    java基础概念1.注释分类单行注释://注释信息多行注释:/*注释信息*/文档注释:/**注释信息*/但是一般不用2.关键字2.1关键字的特点关键字的字母全部小写常用的代码编辑器,针对关键字有特殊的颜色标记,非常直观。注意:关键字很多,不用刻意去记。abstracta......
  • Java 线程的六种状态及转化
    原文:Java:线程的六种状态及转化java.lang.Thread.State枚举类中定义了六种线程的状态,可以调用线程Thread中的getState()方法获取当前线程的状态。线程状态解释NEW尚未启动的线程状态,即线程创建,还未调用start方法RUNNABLE就绪状态(调用start,等待调度)+正在运行......
  • Educational Codeforces Round 168 (Rated for Div. 2) D题
    文章目录题目来源题意思路code题目来源D.MaximizetheRoot题意给定一棵n个点的数,根节点为1,每个点都有权值aia_i......
  • Magnet AXIOM 8.0 Windows x64 Multilingual - 数字取证与分析
    MagnetAXIOM8.0Windowsx64Multilingual-数字取证与分析DigitalForensicSoftware请访问原文链接:https://sysin.org/blog/magnet-axiom/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgMagnetAXIOM-恢复并分析一个案件中的证据检查来自移动、云、......
  • Visual Studio使用Git进行代码版本管理
    一、VisualStudio创建一个项目1、在VisualStudio中创建一个项目,我创建的项目名称是"mainApi"二、Gitee中新建仓库1、右上角点击【个人头像】,选择【新建仓库】2、输入对应的信息,点击【创建】-(1)输入仓库名称,一般与本地程序名称一致-(2)介绍一下该仓库是干什么的,也可以不......
  • Linux云计算 |【第二阶段】OPERATION-DAY6
    主要内容:RPM打包(生成目录结构、拷贝源码软件包、编写SPEC文件)、VPN服务器(GREVPN、PPTPVPN、L2TP+IPSecVPN)、Systemd服务管理(命令行工具、编写Unit配置文件)一、RPM软件打包RPM(RedHatPackageManager)是一种用于Linux系统的软件包管理系统,主要用于RedHat系列发行版(......
  • 正点原子领航者ZYNQ7020开发板 GMAC1 EMIO调试记录
    ZYNQ7020GMAC1EMIO裸机功能调试ZYNQ嵌入式系统开发流程1:创建Vivado工程2:创建ProcessSystem3:生成顶层HDL添加EMIO引脚约束4:生成Bitstream并导出到SDK启动SDK5:创建LWIPEcho测试工程6:编译工程并在开发板上进行测试LinuxKernel中GMIITORGMIIIP的......
  • Linux云计算 |【第二阶段】OPERATION-DAY5
    主要内容:Tomcat概述、Tomcat部署安装、Tomcat应用案例(虚拟主机、地址重写、SSL加密站点、Tomcat日志)、Tomcat集群,maven应用一、Tomcat概述ApacheTomcat(简称Tomcat)是一个开源的JavaServlet容器,由Apache软件基金会开发和维护。它实现了JavaServlet和JavaServerPa......