Java IO 和 NIO 的基本概念和 API
一、 Java IO (Blocking IO)
-
基本概念:
- Java IO 是 Java 平台提供的用于进行输入和输出操作的 API。
- Java IO 基于 流 (Stream) 的模型,数据像水流一样从一个地方流向另一个地方。
- Java IO 主要是 阻塞式 I/O (Blocking I/O),即线程在执行 I/O 操作时会被阻塞,直到操作完成。
- 传统IO指的是
java.io
包下的部分组件(File, InputStream, OutputStream, Reader, Writer)。
-
IO 流的分类:
-
按数据传输方向:
- 输入流 (Input Stream): 用于从数据源读取数据(例如,从文件、网络连接、键盘等)。 以
InputStream
或Reader
作为基类。 - 输出流 (Output Stream): 用于将数据写入到目标(例如,写入到文件、网络连接、控制台等)。 以
OutputStream
或Writer
作为基类。
- 输入流 (Input Stream): 用于从数据源读取数据(例如,从文件、网络连接、键盘等)。 以
-
按数据传输单位:
- 字节流 (Byte Stream): 以字节 (8 bits) 为单位进行数据传输。 以
InputStream
和OutputStream
作为基类。 适用于处理二进制数据(例如,图片、音频、视频等)。 - 字符流 (Character Stream): 以字符 (16 bits) 为单位进行数据传输。 以
Reader
和Writer
作为基类。 适用于处理文本数据。
- 字节流 (Byte Stream): 以字节 (8 bits) 为单位进行数据传输。 以
-
-
核心类和接口:
-
InputStream
(字节输入流):FileInputStream
: 从文件中读取字节。ByteArrayInputStream
: 从字节数组中读取字节。ObjectInputStream
: 从对象流中读取对象。BufferedInputStream
: 带缓冲的字节输入流,提高读取效率。
-
OutputStream
(字节输出流):FileOutputStream
: 向文件中写入字节。ByteArrayOutputStream
: 向字节数组中写入字节。ObjectOutputStream
: 向对象流中写入对象。BufferedOutputStream
: 带缓冲的字节输出流,提高写入效率。
-
Reader
(字符输入流):FileReader
: 从文件中读取字符。CharArrayReader
: 从字符数组中读取字符。BufferedReader
: 带缓冲的字符输入流,提高读取效率。InputStreamReader
: 将字节输入流转换为字符输入流(需要指定字符编码)。
-
Writer
(字符输出流):FileWriter
: 向文件中写入字符。CharArrayWriter
: 向字符数组中写入字符。BufferedWriter
: 带缓冲的字符输出流,提高写入效率。OutputStreamWriter
: 将字节输出流转换为字符输出流(需要指定字符编码)。
-
File
: 表示文件或目录的抽象表示。
-
-
IO 操作流程 (以读取文件为例):
- 创建
File
对象: 指定要读取的文件路径。 - 创建
FileInputStream
对象: 将File
对象作为参数传递给FileInputStream
的构造方法,创建一个FileInputStream
对象。 - 创建
BufferedInputStream
对象 (可选): 将FileInputStream
对象作为参数传递给BufferedInputStream
的构造方法,创建一个BufferedInputStream
对象,提高读取效率。 - 读取数据: 使用
read()
方法从输入流中读取数据。 - 关闭流: 在完成读取操作后,务必关闭输入流,释放资源(先关闭
BufferedInputStream
,再关闭FileInputStream
)。
- 创建
-
代码示例 (读取文件内容):
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)
-
基本概念:
- Java NIO 是 Java 1.4 引入的一组新的 I/O API,旨在提供高性能、非阻塞的 I/O 操作。
- NIO 使用 通道 (Channel) 和 缓冲区 (Buffer) 的模型,而不是流。
- NIO 主要是 非阻塞式 I/O (Non-blocking I/O),即线程在执行 I/O 操作时不会被阻塞,而是可以执行其他任务。
- NIO 使用 选择器 (Selector) 来监听多个通道的事件,实现单线程管理多个连接。
-
核心组件:
-
通道 (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):
- 选择器允许单个线程监听多个通道的事件(例如连接建立、数据可读、数据可写等)。
- 使用选择器可以避免为每个连接创建一个线程,从而提高并发性能。
-
-
NIO 操作流程 (以读取 SocketChannel 数据为例):
- 创建
ServerSocketChannel
: 监听客户端连接。 - 创建
SocketChannel
: 接受客户端连接。 - 将
SocketChannel
注册到Selector
: 指定要监听的事件(例如OP_READ
,OP_WRITE
,OP_CONNECT
,OP_ACCEPT
)。 - 创建
ByteBuffer
: 用于存储读取到的数据。 - 调用
selector.select()
方法: 阻塞等待有事件发生的通道。 - 获取就绪的通道:
selector.selectedKeys()
返回所有就绪通道的集合。 - 处理事件: 遍历就绪通道的集合,根据不同的事件类型执行相应的操作(例如读取数据、写入数据)。
- 读取数据: 调用
channel.read(buffer)
从通道读取数据到缓冲区。 - 处理缓冲区数据: 从缓冲区读取数据并进行处理。
- 关闭通道和选择器: 在完成操作后,务必关闭通道和选择器,释放资源。
- 创建
-
代码示例 (使用 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. 创建 SocketChannelSocketChannel socketChannel = SocketChannel.open();socketChannel.connect(new InetSocketAddress("www.example.com", 80));socketChannel.configureBlocking(false); // 设置为非阻塞模式// 2. 创建 ByteBufferByteBuffer buffer = ByteBuffer.allocate(1024);// 3. 从 Channel 读取数据到 Bufferint 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 操作。
相关文章:
Java IO 和 NIO 的基本概念和 API
一、 Java IO (Blocking IO) 基本概念: Java IO 是 Java 平台提供的用于进行输入和输出操作的 API。Java IO 基于 流 (Stream) 的模型,数据像水流一样从一个地方流向另一个地方。Java IO 主要是 阻塞式 I/O (Blocking I/O),即线程在执行 I/O …...

小智AI桌宠机器狗
本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…...
MySQL 入门“鸡”础
一、Win10 与Ubuntu安装 以下是一篇针对 Ubuntu 安装 MySQL 的过程中写的示例: --- # Ubuntu 安装 MySQL 详细指南 在本教程中,我们将向您展示如何在 Ubuntu 上安装 MySQL,并完成基本的安全配置。以下是具体步骤: # 1. 安装 …...
Redis 中有序集合(Sorted Set)的使用方法
文章目录 前言1. 有序集合的特点2. 常用命令2.1 添加元素(ZADD)2.2 获取元素分数(ZSCORE)2.3 获取元素排名(ZRANK / ZREVRANK)2.4 获取范围内的元素(ZRANGE / ZREVRANGE)2.5 获取分数…...

WIn32 笔记:本专栏课件
专栏导航 上一篇:在VS2019里面,调整代码字体大小 回到目录 下一篇:无 本节前言 在之前的讲解里面,我讲解了 Visual Studio 软件的一些个基础操作步骤。从本节开始,我们进入预备章。 本节内容,属于是 …...
Unity git 获取当前修改或者新增的文件列表
直接上代码 using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Text.RegularExpressions; using UnityEngine;public class GitFileStatusCheckerTools : MonoBehaviour {// 获取Git变更文件列表(新增/修…...
结构型模式 - 桥接模式 (Bridge)
结构型模式 - 桥接模式 (Bridge) 桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。 // 软件接口,作为实现部分 interface Software {void run(); }// 游戏软件类,实现 Software 接口 class Game…...

如何让传统制造企业从0到1实现数字化突破?
随着全球制造业不断向智能化、数字化转型,传统制造企业面临着前所未有的机遇与挑战。数字化转型不仅是技术的革新,更是管理、文化、业务流程等全方位的变革。从零开始,如何带领一家传统制造企业走向数字化突破,是许多企业领导者面…...
【Elasticsearch】script_fields 和 runtime_fields的区别
script_fields和runtime_fields都是 Elasticsearch 中用于动态计算字段值的功能,但它们在实现方式、应用场景和性能表现上存在显著区别。以下是两者的详细对比: 1.定义和应用场景 • script_fields: • 定义:通过 Painless 脚本…...

城电科技|会追日的智能花,光伏太阳花开启绿色能源新篇章
当艺术与科技相遇,会碰撞出怎样的火花?城电科技推出的光伏太阳花,以其独特的设计与智能化的功能,给出了答案。这款产品不仅具备太阳能发电的实用功能,更是一件充满科技属性的艺术性光伏产品,吸引了广泛关注…...

【笔记ing】C语言补充、组成原理数据表示与汇编实战、操作系统文件实战(高级阶段)
【第19节 C语言语法进阶】 【19.1 条件运算符与逗号运算符】 1 条件运算符 条件运算符是C语言中唯一的一种三亩运算符。三目运算符代表有三个操作数;双目运算符代表有两个操作数,如逻辑运算符就是双目运算符;弹幕运算符代表有一个操作数&a…...

快节奏生活
在当今快节奏的商务环境中,效率成为了决定企业竞争力的关键因素之一。亿可达软件连接平台,以其独特的功能和优势,为职场人士带来了前所未有的便捷与高效,成为了众多用户心中的“宝藏”工具。 1、亿可达:自动化流程的搭…...

【音视频】音视频录制、播放原理
一、音视频录制原理 通常,音视频录制的步骤如下图所示: 我们分别从音频和视频开始采样,通过麦克风和摄像头来接受我们的音频信息和图像信息,这通常是同时进行的,不过,通常视频的采集会比音频的采集慢&…...
前端Sass面试题及参考答案
目录 什么是 Sass? Sass 和 CSS 的主要区别是什么? Sass 中如何处理列表? Sass 中如何处理映射(map)? Sass 中如何使用函数? Sass 中如何使用内置函数? Sass 中如何设置默认值? Sass 中的 @function 和 @mixin 有什么区别? Sass 中如何实现模块化? Sass 中…...

Web自动化之Selenium控制已经打开的浏览器(Chrome,Edge)
在使用selenium进行web自动化或爬虫的时候,经常会面临登录的情况,对于这种情况,我们可以利用Selenium控制已经打开的浏览器,从而避免每次都需要重新打开浏览器并进行登录的繁琐步骤。 目录 说明 启动浏览器 注意 --user-data-dir说明 代码设定 代码 改进代…...
AF3 unify_template_features 函数解读
AlphaFold3 data_pipeline 模块的 unify_template_features 函数用于将多条链的模板特征整合为一个统一的 FeatureDict,以适应对多链复合物的处理。每条链的模板特征经过索引偏移处理后,拼接为一个完整的模板特征矩阵。 该方法的核心在于: 序列对齐:根据每条链的长度,将模…...

FFmpeg.NET:.NET 平台上的音视频处理利器
FFmpeg.NET 是一个封装了 FFmpeg 功能的 .NET 库,能够方便地在 C# 项目中处理音视频文件。它支持多种操作,包括转码、剪辑、合并、分离音频等。 功能 解析元数据从视频生成缩略图使用以下参数将音频和视频转码为其他格式: 码率(…...
解决 Git 合并冲突:当本地修改与远程提交冲突时
目录 错误原因分析 解决方法 1. 暂存本地修改并合并(保留更改) 2. 丢弃本地修改(强制覆盖) 3. 暂存修改后合并(推荐:使用 git stash) 4. 选择性合并(手动处理冲突文件…...

SOME/IP-SD -- 协议英文原文讲解5
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.5 S…...

spark的一些指令
一,复制和移动 1、复制文件 格式:cp 源文件 目标文件 示例:把file1.txt 复制一份得到file2.txt 。那么对应的命令就是:cp file1.txt file2.txt 2、复制目录 格式:cp -r 源文件 目标文件夹 示例:把目…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...