IO

news2024/11/15 11:05:30

目录

一、IO流基本认识

1.1 字节流

1.2 字符流

1.3 高级流

二、IO流基本理解

2.1 IO流的分类

2.1.1 按照流的流向

2.1.2 按照处理数据单位

2.1.3 按照流的角色

2.2 IO流的选择

2.3 IO流的4个抽象基类

 2.4 字节流和字符流的区别

 2.4.1 使用场景

三、IO模型 

3.1 BIO(Blocking IO)

3.2 NIO(Non-blocking IO)

3.3 AIO(Asynchronous IO)

 3.4 IO多路复用

3.5 BIO/NIO/AIO区别

3.6 NIO的实现原理

四、序列化和反序列化


一、IO流基本认识

Java中的IO流是用于处理输入和输出的机制。分为输入流和输出流

Java的IO流主要分为两大类:字节流和字符流

1.1 字节流

  • InputStream和OutputStream:是所有字节输入流和输出流的抽象类,它们分别用于读取和写入字节
  • FileInputStream和FileOutputStream:用于从文件中读取字节和向文件中写入字节
  • ByteArrayInputStream和ByteArrayOutputStream:分别用于从字节数组中读取数据和将数据写入字节数组
InputStream in = new FileInputStream("input.txt");
OutputStream out = new FileOutputStream("output.txt");
FileInputStream fis = new FileInputStream("file.txt");
FileOutputStream fos = new FileOutputStream("output.txt");
ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
ByteArrayOutputStream baos = new ByteArrayOutputStream();

1.2 字符流

  • Reader和Writer:是所有字符输入流和输出流的抽象基类,它们分别用于读取和写入字符
  • FileReader和FileWriter:用于从文件中读取字符和向文件中写入字符
  • BufferedReader和BufferedWriter:用于提供缓冲区,提高读取和写入的效率
Reader reader = new FileReader("input.txt");
Writer writer = new FileWriter("output.txt");
FileReader fr = new FileReader("file.txt");
FileWriter fw = new FileWriter("output.txt");
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"));

1.3 高级流

  • ObjectInputStream和ObjectOutputStream:用于读取和写入对象。可以序列化和反序列化对象
  • DataInputStream和DataOutputStream:用于读取和写入基本数据类型
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.dat"));
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.dat"));

二、IO流基本理解

2.1 IO流的分类

2.1.1 按照流的流向

分为输入流和输出流,这里的输入输出是针对程序来说的

  • 输出:把程序(内存)中的内容输出到磁盘、光盘等存储设备中
  • 输入:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中

2.1.2 按照处理数据单位

分为字节流和字符流

  • 字节流:每次读取/写出一个字节,当传输的资料文件中有中文时,就会出现乱码
  • 字符流:每次读取/写出两个字节,有中文时,使用该流就可以正确传输显示中文。1字符=2字节

2.1.3 按照流的角色

分为节点流和处理流

  • 节点流:从或者向一个特定的地方(节点)读写数据。如FileInputSream
  • 处理流(包装流):是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader

注意:一个IO流可以既是输入流又是字节流又或是以其他方式分类的流类型,是不冲突的

2.2 IO流的选择

根据三步选择适合自己的流:

1、选择输入流还是输出流:看是想向程序写数据,还是从程序取数据

2、考虑传输数据是每次传一个字节还是两个字节:是否存在中文

3、通过前两步可以选出一个合适的节点流了,如果想在此基础上增强功能,那么在处理流中选择一个合适的即可

2.3 IO流的4个抽象基类

  • 输入字节流:InputStream
  • 输出字节流:OutputStream
  • 输入字符流:Writer
  • 输出字符流:Reader

 2.4 字节流和字符流的区别

计算机中的一切最终都是二进制的字节形式存在,底层设备永远只接受字节数据。有时候要写字符串到底层设备,需要将字符串转成字节再进行写入。

字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的;

字符流在操作时使用了缓冲区,通过缓冲区再操作文件

 2.4.1 使用场景

  • 字节流:一般用来处理图像、视频、PPT、Word类型的文件
  • 字符流:一般用于处理纯文本类型的文件,如TXT文件

字节流可以用来处理纯文本文件,但字符流不能用于处理图像视频等非文本类型的文件 

三、IO模型 

3.1 BIO(Blocking IO)

BIO属于同步阻塞IO模型,读取或写入数据的时候,线程将一直等待,知道数据准备就绪或写入操作完成。但在高并发环境下可能导致性能问题,因为线程在等待IO操作完成时被阻塞,无法执行其他任务。

3.2 NIO(Non-blocking IO)

NIO属于非阻塞IO模型,线程执行一个IO操作时不会等待,而是继续执行其他任务,这需要通过轮询或者使用回调函数等机制来检查IO操作是否完成。

3.3 AIO(Asynchronous IO)

 AIO属于异步IO模型,允许程序在执行IO操作时继续执行其他任务,而不需要等待

 3.4 IO多路复用

IO多路复用模型使用了操作系统提供的选择器(Selector)机制。通过选择器,一个线程可以监听多个通道上的IO事件,从而在单线程中处理多个连接。

3.5 BIO/NIO/AIO区别

 1、BIO

  • 工作原理:阻塞IO模型中,当一个线程执行IO操作时,它会被阻塞,知道IO操作完成,这会导致线程无法执行其他任务
  • 适用场景:适用于连接数较少、并发不高的场景

2、NIO

  • 工作原理:非阻塞IO模型中,一个线程可以处理多个连接,而不需要等待每个连接的IO操作完成。但线程需要通过轮询(polling)或者选择器(Selector)来检查哪些连接已经准备好进行IO操作
  • 适用场景:适用于高并发、连接数较多的场景。Java NIO提供了Selector、Channel等组件,可以更好地支持多连接的管理

3、AIO

  • 工作原理:异步IO模型中,程序发起IO操作后,可以继续执行其他任务。当IO操作完成时,系统会通知程序,并调用相应的回调函数
  • 适用场景:适用于需要处理大量并发连接的场景,并希望充分利用系统资源。Java NIO.2 提供了AIO支持,通过AsynchronousChannel和CompletionHandler实现异步IO操作

 总结:

BIO: 适用于连接数较少、并发不高的情况,简单易用。

NIO: 适用于高并发、连接数较多的网络应用,通过选择器实现非阻塞 I/O。

AIO: 适用于需要处理大量并发连接、希望充分利用系统资源的情况,通过异步操作实现。

3.6 NIO的实现原理

 Java NIO的实现原理主要涉及到一下几个核心概念和组件:

Channel(通道):抽象概念,类似于传统的流,但更加灵活。Channel可以是读、写或者读写的,并且可以异步地进行IO操作

Buffer(缓冲区):是NIO中用于存储数据的容器。Channel从Buffer中读取数据,将数据写入Buffer中

Selector(选择器):它允许一个线程同时监控多个Channel,当其中的某个Channel发生读或写事件时,可以通过Selector得到通知。这样一个线程可以有效地管理多个网络连接

 工作原理可以分为以下几个步骤:

1、打开Channel:通过FileChannel、SocketChannel、ServerSocketChannel等类的静态方法open()打开一个通道

2、创建Buffer:创建一个或多个Buffer,用于读取或写入数据

3、将数据写入Channel:将数据写入Buffer,然后将Buffer中的数据写入Channel

4、从Channel读取数据:将Channel中的数据读取到Buffer中

5、注册Channel到Selector:通过Selector监听一个或多个Channel,当Channel上发生感兴趣的事件时,Selector将通知程序

6、处理事件:在一个循环中调用Selector的select()方法,该方法会阻塞至少一个注册的Channel发生了感兴趣的事件。然后通过迭代selectedKeys()获取SelectionKey,从而得知哪个Channel上发生了事件

四、序列化和反序列化

序列化机制:将对象转换成字节序列

对象的序列化:将一个Java对象写入IO流中

对象的反序列化: 从IO流中恢复该Java对象

若对象要支持序列化机制,则它的类需要实现Serializable接口。该接口是一个标记接口,它没有提供任何方法,只是标明该类是可以序列化的。Java的很多类已经实现了Serializable接口,如包装类、String、Date等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2041608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode JAVA刷刷站(10)正则表达式匹配

一、题目概述 二、思路方向 在Java中,实现一个支持.和*的正则表达式匹配器,可以通过递归或动态规划(DP)的方法来完成。这里,我将使用动态规划的方法来解决这个问题,因为它更容易理解和实现。 动态规划的思…

代码随想录算法训练营43期 | Day 13 —— 二叉树part01

代码随想录算法训练营 二叉树理论基础二叉树的种类1. 满二叉树2. 完全二叉数3. 二叉搜索树3. 平衡二叉搜索树 二叉树的存储方式二叉树遍历方式二叉树的定义 二叉树的递归遍历144.前序遍历145.后序遍历94.中序遍历 二叉树迭代遍历前序遍历(迭代法)后序遍历…

实战项目:贪吃蛇游戏的实现(下)

前言 今天我们将继续贪吃蛇游戏的实现,紧接上期我们已经实现了贪吃蛇游戏的大部分基础知识,我们上期主要是学习了Windows系统的API函数,并实现了大部分的贪吃蛇设计,那这期我们将完成剩余的设计部分,并完成代码的实现。 好&…

UEC++学习(十六)变量添加中文注释、ui设置中文文本

(一)变量添加中文注释 在C 项目中创建变量,并在蓝图中显示变量的英文名同时附带中文注释,可以使用UPROPERTY 的 ToolTip 元数据属性来实现 UPROPERTY(EditAnywhere, meta (ToolTip "弹夹最大容量"))int32 MagCapacit…

目标检测算法,Yolov7本地化部署标注、训练(二)

安全帽检测、口罩检测、行为检测、目标物体检测,随着深度学习和计算机视觉技术的不断发展,目标检测成为了研究热点之一。YOLOv7作为YOLO系列的新成员,以其高效和准确的性能受到了广泛关注。本文将介绍如何在本地部署并利用YOLOv7完成目标检测…

StormBamboo 入侵 ISP 并滥用不安全的软件更新机制

关键要点 StormBamboo 成功入侵了一家互联网服务提供商 (ISP),以毒害目标组织的 DNS 响应。不安全的软件更新机制旨在在运行 macOS 和 Windows 的受害者机器上秘密安装恶意软件。StormBamboo 部署的恶意软件包括 MACMA 恶意软件的新变种。对 MACMA 最新版本的分析表…

Python学习入门实验

(1)掌握python数字类型的使用方法 (2)掌握将数学表达式转换成python语言表达式的方法及注意 (3)掌握有关运算符号的特殊要求 (4)掌握输入、输出函数的使用方法 (5&am…

Python与netCDF数据之全面解析空间偏相关分析详解

概要 在气象学、海洋学、环境科学等领域,netCDF(Network Common Data Form)是一种常用的数据格式,用于存储和共享多维科学数据。偏相关分析(Partial Correlation Analysis)是一种统计方法,用于研究多个变量之间的关系,同时控制其他变量的影响。本文将详细介绍如何使用…

VTK-vtkStructuredGrid学习

vtkStructuredGrid是具有规则拓扑和不规则几何的数据集。可以理解为单元格顺序沿着坐标轴排列,但是每个单元格可以不一样。看了很多文字解释,感觉不清楚,直接用图解验证: 1.使用CAD随意绘制个网格草图 2.获取这些点信息&#xff…

Sealos 就是小团队的神器

作者:阳明。Kubernetes 布道师,公众号 K8s 技术圈主理人 最近我们新开发了一个项目 fastclass.cn,这个项目是一个独立开发者的学习网站,我们的目标是帮助你使用 Figma、Python、Golang、React、VUE、Flutter、ChatGPT 等设计构建真…

【linux】linux中如何通过systemctl来创建和管理服务

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

【网络】从零认识IPv4

目录 IP地址定义 网络标识和主机标识 子网掩码 IPv4地址的分类 全局地址和私有地址 个人主页:东洛的克莱斯韦克-CSDN博客 IP地址定义 IP是网络中每台设备的唯一标识符,用于识别和定位计算机、服务器、路由器等设备,以便它们能够在网络上…

VictoriaMetrics快速入门

文章目录 Multitenancy集群部署启动vmstorage服务启动vminsert服务启动 vmselect服务 配置使用集群大小调整和可伸缩性grafana展示参考资料 VictoriaMetrics是快速,经济高效且可扩展的时间序列数据库。它可以用作Prometheus的长期远程存储。 VictoriaMetrics集群包含…

鸿蒙开发5.0【同页面内的点击操作响应时延问题】分析思路案例

1. 场景导入 同页面内点击操作时延是指,应用内手指点击从离开屏幕开始,到页面发生变化的时间。常见场景包括点击后界面元素变化,弹出弹窗或者loading动画等场景。 2. 性能指标 2.1 性能衡量起始点介绍 1.点击操作响应时延的性能衡量的起点…

GitLab-CI/CD指南

由于公司没有运维,写go服务时各个环境编译部署还是略显麻烦,由于代码管理使用的是 gitlab,所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署,这样每次提交代码以后就可以自动部署到服务器上了。 gitlab 本身只有 CI/CD 的接…

金蝶云星辰V1与旺店通·企业版对接集成采购入库单查询(列表+详情)连通创建其他入库单(其他)

金蝶云星辰V1与旺店通企业版对接集成采购入库单查询(列表详情)连通创建其他入库单(其他) 接入系统:金蝶云星辰V1 金蝶云星辰基于金蝶云苍穹云原生PaaS平台构建,聚焦小型企业在线经营和数字化管理,提供财务云、税务云、…

操作系统中的进程:深入解析与理解

文章目录 一、什么是进程?🤔二、进程的特性 🌟三、进程的组成 🧩四、进程的状态与转换 🔄🔀五、进程的调度与管理 🔧🔀六、代码示例(C)创建进程进程等待&…

scanf中%c前加不加空格的区别

%c前加空格可以让scanf跳过空白字符&#xff08;如空格、制表符、换行符等&#xff09;&#xff0c;直接读取非空白字符。如果不加空格就会读取空白字符。 可以用两段测试客官有无慧根的程序来说明这个问题&#xff0c;测试代码如下&#xff1a; #include <stdio.h> in…

Ubuntu22.04安卓编译环境搭建及so库编译

1.配置Android-ARM64开发环境工具链: vim ~/.profile 或者 ~/.bashrc 或者 /etc/profile 编辑环境变量文件 输入下面内容 export CROSS_TRIPLE=aarch64-linux-android export CROSS_ROOT=/usr/${CROSS_TRIPLE} export ANDROID_NDK=${CROSS_ROOT} export AS=${CROSS_ROOT}…

【人工智能】数据集合集!

本文将为您介绍10个经典、热门的数据集&#xff0c;希望对您在选择适合的数据集时有所帮助。 点击蓝字 关注我们 1 Habitat Platform 发布方&#xff1a; Facebook AI Research西蒙菲莎大学佐治亚理工学院Facebook Reality LabsIntel LabsUniversity of California, Berkeley…