Java IO 和 NIO 的基本概念和 API

Java IO模型&NIO Java IO模型&NIO Java IO模型NIO 楔子 概述 网络服务 经典的服务设计 经典的SocketServer循环阻塞 可伸缩目标 分而治之 事件驱动设计 背景知识AWT 事件 Reactor 模式 Reactor基础模式 Java NIO 支持 Channels Buffers Selectors SelectionKeys Reactor 模式实践 第一步初始化 第二步循环分发 第三 阅读详情

一、 Java IO (Blocking IO)

  1. 基本概念:

    • Java IO 是 Java 平台提供的用于进行输入和输出操作的 API。
    • Java IO 基于 流 (Stream) 的模型,数据像水流一样从一个地方流向另一个地方。
    • Java IO 主要是 阻塞式 I/O (Blocking I/O),即线程在执行 I/O 操作时会被阻塞,直到操作完成。
    • 传统IO指的是java.io包下的部分组件(File, InputStream, OutputStream, Reader, Writer)。
  2. IO 流的分类:

    • 按数据传输方向:

      • 输入流 (Input Stream): 用于从数据源读取数据(例如,从文件、网络连接、键盘等)。 以 InputStream 或 Reader 作为基类。
      • 输出流 (Output Stream): 用于将数据写入到目标(例如,写入到文件、网络连接、控制台等)。 以 OutputStream 或 Writer 作为基类。
    • 按数据传输单位:

      • 字节流 (Byte Stream): 以字节 (8 bits) 为单位进行数据传输。 以 InputStream 和 OutputStream 作为基类。 适用于处理二进制数据(例如,图片、音频、视频等)。
      • 字符流 (Character Stream): 以字符 (16 bits) 为单位进行数据传输。 以 Reader 和 Writer 作为基类。 适用于处理文本数据。
  3. 核心类和接口:

    • InputStream (字节输入流):

      • FileInputStream: 从文件中读取字节。
      • ByteArrayInputStream: 从字节数组中读取字节。
      • ObjectInputStream: 从对象流中读取对象。
      • BufferedInputStream: 带缓冲的字节输入流,提高读取效率。
    • OutputStream (字节输出流):

      • FileOutputStream: 向文件中写入字节。
      • ByteArrayOutputStream: 向字节数组中写入字节。
      • ObjectOutputStream: 向对象流中写入对象。
      • BufferedOutputStream: 带缓冲的字节输出流,提高写入效率。
    • Reader (字符输入流):

      • FileReader: 从文件中读取字符。
      • CharArrayReader: 从字符数组中读取字符。
      • BufferedReader: 带缓冲的字符输入流,提高读取效率。
      • InputStreamReader: 将字节输入流转换为字符输入流(需要指定字符编码)。
    • Writer (字符输出流):

      • FileWriter: 向文件中写入字符。
      • CharArrayWriter: 向字符数组中写入字符。
      • BufferedWriter: 带缓冲的字符输出流,提高写入效率。
      • OutputStreamWriter: 将字节输出流转换为字符输出流(需要指定字符编码)。
    • File: 表示文件或目录的抽象表示。

  4. IO 操作流程 (以读取文件为例):

    1. 创建 File 对象: 指定要读取的文件路径。
    2. 创建 FileInputStream 对象: 将 File 对象作为参数传递给 FileInputStream 的构造方法,创建一个 FileInputStream 对象。
    3. 创建 BufferedInputStream 对象 (可选): 将 FileInputStream 对象作为参数传递给 BufferedInputStream 的构造方法,创建一个 BufferedInputStream 对象,提高读取效率。
    4. 读取数据: 使用 read() 方法从输入流中读取数据。
    5. 关闭流: 在完成读取操作后,务必关闭输入流,释放资源(先关闭 BufferedInputStream,再关闭 FileInputStream)。
  5. 代码示例 (读取文件内容):

    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class IOExample {
        public static void main(String[] args) {
            File file = new File("test.txt"); // 替换为你的文件路径
    
            try (FileInputStream fis = new FileInputStream(file);
                 BufferedInputStream bis = new BufferedInputStream(fis)) { // 使用 try-with-resources 语句,自动关闭流
    
                byte[] buffer = new byte[1024];
                int bytesRead;
    
                while ((bytesRead = bis.read(buffer)) != -1) {
                    // 处理读取到的数据
                    String data = new String(buffer, 0, bytesRead);
                    System.out.print(data);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

二、 Java NIO (Non-blocking IO)

  1. 基本概念:

    • Java NIO 是 Java 1.4 引入的一组新的 I/O API,旨在提供高性能、非阻塞的 I/O 操作。
    • NIO 使用 通道 (Channel) 和 缓冲区 (Buffer) 的模型,而不是流。
    • NIO 主要是 非阻塞式 I/O (Non-blocking I/O),即线程在执行 I/O 操作时不会被阻塞,而是可以执行其他任务。
    • NIO 使用 选择器 (Selector) 来监听多个通道的事件,实现单线程管理多个连接。
  2. 核心组件:

    • 通道 (Channel):

      • 通道类似于流,但可以进行双向数据传输(既可以读取数据,也可以写入数据)。
      • 常见的通道:
        • FileChannel: 用于文件 I/O。
        • SocketChannel: 用于 TCP 网络 I/O (客户端)。
        • ServerSocketChannel: 用于 TCP 网络 I/O (服务器端)。
        • DatagramChannel: 用于 UDP 网络 I/O。
    • 缓冲区 (Buffer):

      • 缓冲区是用于存储数据的容器,本质上是一个字节数组 (ByteBuffer) 或字符数组 (CharBuffer)。
      • NIO 使用缓冲区进行数据传输,而不是直接从通道读取数据或向通道写入数据。
      • 常见的缓冲区:
        • ByteBuffer: 字节缓冲区。
        • CharBuffer: 字符缓冲区。
        • ShortBuffer: 短整型缓冲区。
        • IntBuffer: 整型缓冲区。
        • LongBuffer: 长整型缓冲区。
        • FloatBuffer: 浮点型缓冲区。
        • DoubleBuffer: 双精度浮点型缓冲区。
    • 选择器 (Selector):

      • 选择器允许单个线程监听多个通道的事件(例如连接建立、数据可读、数据可写等)。
      • 使用选择器可以避免为每个连接创建一个线程,从而提高并发性能。
  3. NIO 操作流程 (以读取 SocketChannel 数据为例):

    1. 创建 ServerSocketChannel: 监听客户端连接。
    2. 创建 SocketChannel: 接受客户端连接。
    3. 将 SocketChannel 注册到 Selector: 指定要监听的事件(例如 OP_READ, OP_WRITE, OP_CONNECT, OP_ACCEPT)。
    4. 创建 ByteBuffer: 用于存储读取到的数据。
    5. 调用 selector.select() 方法: 阻塞等待有事件发生的通道。
    6. 获取就绪的通道: selector.selectedKeys() 返回所有就绪通道的集合。
    7. 处理事件: 遍历就绪通道的集合,根据不同的事件类型执行相应的操作(例如读取数据、写入数据)。
    8. 读取数据: 调用 channel.read(buffer) 从通道读取数据到缓冲区。
    9. 处理缓冲区数据: 从缓冲区读取数据并进行处理。
    10. 关闭通道和选择器: 在完成操作后,务必关闭通道和选择器,释放资源。
  4. 代码示例 (使用 SocketChannel 读取数据):

    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.SocketChannel;
    
    public class NIOExample {
        public static void main(String[] args) throws IOException {
            // 1. 创建 SocketChannel
            SocketChannel socketChannel = SocketChannel.open();
            socketChannel.connect(new InetSocketAddress("www.example.com", 80));
            socketChannel.configureBlocking(false); // 设置为非阻塞模式
    
            // 2. 创建 ByteBuffer
            ByteBuffer buffer = ByteBuffer.allocate(1024);
    
            // 3. 从 Channel 读取数据到 Buffer
            int bytesRead = socketChannel.read(buffer);
    
            while (bytesRead > 0) {
                // 切换到读模式
                buffer.flip();
    
                // 4. 从 Buffer 读取数据
                while (buffer.hasRemaining()) {
                    System.out.print((char) buffer.get());
                }
    
                // 清空 Buffer,准备下一次读取
                buffer.clear();
                bytesRead = socketChannel.read(buffer);
            }
    
            socketChannel.close();
        }
    }
    

三、 Java IO 与 NIO 的区别

特性Java IO (Blocking IO)Java NIO (Non-blocking IO)
数据传输方式基于流 (Stream)基于通道 (Channel) 和缓冲区 (Buffer)
I/O 模型阻塞式 I/O (Blocking I/O)非阻塞式 I/O (Non-blocking I/O)
选择器没有有 (Selector)
API简单易用相对复杂,需要理解通道、缓冲区、选择器等概念
性能性能较低 (高并发下)性能较高 (高并发下)
线程模型通常使用多线程模型 (每个连接一个线程)通常使用单线程多路复用模型 (一个线程管理多个连接)
适用场景低并发、连接数较少的应用,或者可以接受阻塞的场景高并发、连接数较多的应用,需要高性能和非阻塞的场景,例如网络服务器、聊天服务器等

四、 选择哪种 I/O 模式?

  • 如果你的应用是低并发、连接数较少,并且可以接受阻塞,那么 Java IO 仍然是一个不错的选择,因为它简单易用。
  • 如果你的应用是高并发、连接数较多,并且对性能要求很高,那么应该使用 Java NIO。
  • 一般情况建议直接使用NIO模型,性能更好。

总结

Java IO 和 NIO 都是 Java 平台提供的用于进行输入和输出操作的 API。 Java IO 基于流的模型,使用简单但性能较低; Java NIO 基于通道和缓冲区的模型,提供高性能、非阻塞的 I/O 操作。

别自己写CDC了!聊聊Xilinx AXI4-Stream Clock Converter IP里的寄存器管道模式到底有多省资源 本文探讨了Xilinx AXI4-Stream Clock Converter IP核的寄存器管道模式在FPGA设计中的高效资源利用。通过对比手工CDC实现,详细解析了IP核的精简化同步架构和时序收敛优势,并提供了实战案例和优化策略,帮助工程师快速实现时钟域转换,显著提升设计效率和性能。 阅读详情

相关推荐

Python地理空间库安装指南:从gdal到geopandas的完整流程

本文详细介绍了Python地理空间库的完整安装流程,包括gdal、rasterio和geopandas等核心库的安装与配置。通过Anaconda环境管理和conda-forge频道,帮助开发者高效解决依赖问题,确保地理空间数据处理环境的稳定运行。

weixin_29091105的博客 462

java基础:IO、NIO

Java NIO、IO https://lrh1993.gitbooks.io/android_interview_guide/content/java/basis/java-nio.html 轻松理解java中的IO与NIO https://zhuanlan.zhihu.com/p/27204492 BIO,AIO,NIO理解: https://baijiahao.baidu.com/s?id=1666632547627347318&wfr=spider&for=pc..

王温暖的博客 1527

InSAR图像配准:从像素级到亚像素级的精度提升策略

本文深入探讨了InSAR图像配准技术,从像素级到亚像素级的精度提升策略。通过分析最大频谱法和相干系数法的适用场景,结合频域补零插值和四叉树分块等高级技术,实现1/8像素级的高精度配准。文章还提供了实用的精度验证方法和常见问题排查指南,为InSAR数据处理提供全面解决方案。

nginx7reverse的博客 836

Java 中的 IO 和 NIO

java io 和 nio 的简单总结

Gjw_java的博客 1687

SAP-PM设备模块-PM主数据之功能位置

SAP-PM模块学习

TRUIXIANG的博客 5137

GAN管CGH40010F设计宽带Doherty功放:如何用ADS搞定输入匹配、合路网络与功分器?

本文详细介绍了基于CGH40010F GaN晶体管的宽带Doherty功放设计流程,重点讲解在ADS平台中实现输入匹配网络、合路网络与功分器的关键技术。通过寄生参数补偿、渐变微带线设计和复合补偿结构等方法,解决了宽带化设计中的核心挑战,最终实现1.7-2.6GHz频段内72%的峰值效率和52%的回退效率。

weixin_42614269的博客 473

java api csdn_优快云技术中心 Java NIO API详解

在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的同步(blocking)API。对于大多数应用来说,这样的API使用很方便,然而,一些对性能要求较高的应用,尤其是服务端应用,往往需要一个更为有效的方式来处理IO。从JDK 1.4起,NIO API作为一个基于缓冲区,并能提供异步(non-blocking)IO操作的API被引入。本文对其进行深入的介绍。NIO API...

weixin_39845825的博客 239

4、基于球面波展开的近场/远场变换技术解析

本文深入解析了基于球面波展开的近场/远场变换技术,涵盖坐标系统选择、截断测量处理、高级SWE方法及实际应用场景。重点介绍了广义SWE、全探头补偿、平移SNF测量(TSWE)等关键技术,结合吸收材料与导电地板系统的误差处理方案,系统总结了各类方法的优缺点与适用场景,并通过流程图和案例分析展示了技术应用路径。该技术在汽车、通信和航空航天领域的天线测量中具有重要价值,可显著提升测量效率与精度。

dell8的博客 255

Java IO 与 NIO

Java IO 与 NIO。

专注分享编程开发与技术进阶干货! 1233

GFPS技术原理(一)-简介

GFPS(谷歌快速配对服务)利用BLE技术简化设备配对流程,相比传统方式大幅提升用户体验。首次配对时,设备广播包含型号ID和安全密钥的BLE信号,手机检测后弹出配对通知,用户点击即可完成安全连接并将设备与Google账户绑定。该技术支持跨设备同步、电量显示、找回设备等功能,后续配对更加便捷。GFPS通过BLE实现快速发现、一键配对和安全连接,结合Google后端服务提供元数据支持,已成为出海设备的认证标准。其核心优势在于简化操作步骤并增强功能性,特别适合非技术用户群体。

十多年蓝牙协议软件开发,擅长蓝牙协议分析 2062

【YOLO11改进 - C3k2融合】C3k2融合DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1054

Java | IO 模式之 JavaNIO 应用

Java | IO 模式之 JavaNIO 应用

为了远大的理想,冲锋! 1625

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java NIO

一、Java NIO简介 Java NIO(New IO,或称Non Blocking IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。 二、Java NIO与传统IO的主要差别 1、传统...

周先生丶的博客 1052

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

网络通信和IO(1):网络通信与IO基本概念/什么是IO,什么是网络通信/文件IO和网络IO的区别/什么是文件描述符/什么是阻塞IO(BIO)/什么是非阻塞IO(NIO)/JAVA中的IO

IO和网络通讯基础概念 首先要从冯诺依曼说起,由他提出的计算机体系结构: 计算器控制(CPU…) ——> 主存(内存…) ——> 输入输出(硬盘、网卡、显示器、键盘…) IO说白了就是输入输出,宏观角度讲可以分为IO设备和IO接口两个部分,IO设备就是输入输出设备,IO设备的工作方式可以由程序进行控制的。IO接口可以理解为 “计算机和其他计算机”,或者 ,“程序与计算机的IO设备”之间的传输接口。 IO它对于任何计算机系统都非常关键,因为所有 I/O 的主体实际上是内置在操作系统中的。程序一

qq_40373699的博客 5676

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

JAVA IO/NIO简介

1.   基本 概念 IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别的工具。 (c 的 printf scanf,java 的面向对象封装 ) 2.    Java 标准 io Java 标准 IO 类库是 io 面向对象的一种抽象。

bit-cafe 1267

JAVA NIO 简介

1.   基本 概念 IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别的工具。 (c 的 printf scanf,java 的面向对象封装 ) 2.    Java 标准 io 回顾 Java 标准 IO 类库是 io 面向对象的一种抽象。基于本地方

专注于互联网架构技术,努力成为一名架构师 1703

JAVA NIO

1.   基本 概念 IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别的工具。 (c 的 printf scanf,java 的面向对象封装 ) 2.    Java 标准 io 回顾 Java 标准 IO 类库是 io 面向对象的一种抽象。基于本地方

Stroller 549

JAVA NIO基础

1. 基本概念IO是主存和外部设备(硬盘、终端和网络等)拷贝数据的过程。IO是操作系统的底层功能实现,底层通过I/O指令进行完成。所有语言运行时系统提供执行I/O较高级别的工具。(c的printf scan...

cipaishang2432的博客 114

java NIO系列:Java NIO Tutorial

Java NIO Tutorial Jakob Jenkov Last update: 2014-06-25      Java NIO (New IO) is an alternative IO API for Java (from Java 1.4), meaning alternative to the standardJava I

wzb56的资料库 580

说说Java NIO【转】

转自:http://www.molotang.com/articles/894.html 在Java发布JDK1.4之后,NIO也随之出现了。NIO的出现实际上是为了给Java开发提供更多更多更灵活的接口,当然也是为了提高性能。我们本篇对NIO做一个概述。 0. IO的同步异步和阻塞 Java NIO就是Java New IO。但NIO也通常会和BIO和AIO放在一起来提,有人把NIO...

weixin_30662849的博客 112
上一篇: MySQL主从同步必然有延迟,怎么解决 ?
下一篇: Spring Boot 中为什么 需要限流、降级和熔断?
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值