IO(输入输出流)

news2024/11/25 17:15:18

1.IO

a.介绍

i.IO是指Input和Output,即输入和输出,以内存为中心:
        1.Input是指从外部读入数据到内存。
        2.Output是指把数据从内存输出到外部。
ii.IO流是一种顺序读写数据的模式,它的特点是单向流动。数据类似自来水一样在水管中流动,所以我们把它称为IO流。

b.InputStream/OutputStream

i.IO流以byte(字节)为最小单位,因此也称为字节流。
ii.InputStream代表输入字节流,OutputStream代表输出字节流,这是最基本的两种IO流。

c.Reader/Writer

i.以char(字符)为最小数据单位来读写,这种称为字符流。
ii.Reader和Writer本质上是一个能自动编解码的InputStream和OutputStream。

d.同步和异步

i.同步IO是指,读写IO时代码必须等待数据返回后才继续执行后续代码。优点:代码编写简单;缺点:CPU执行效率低。
ii.异步IO是指,读写IO时仅发出请求,然后立刻执行后续代码。优点:CPU执行效率高,缺点:代码编写复杂。

2.File

a.File对象

i.文件是非常重要的存储方式。Java标准库java.io提供了File对象来操作文件和目录。
ii.构建File对象时,需要传入文件路径:可以是绝对路径,也可以是相对路径。
iii.Windows平台使用 \ 作为路径分隔符,在Java中需要用 \\ 表示一个 \ 。Linux平台用 / 作为分隔符路径。
iv.可以用 . 表示当前目录,用 .. 表示上级目录。
v.File对象有3种形式表示的路径,getPath():返回构造方法传入的路径;getAbsoluteFile():返回绝对路径;getCanonicalFile():返回规范路径。

b.文件和目录

i.File对象既可以表示文件也可以表示目录。构建File对象时,并不会对磁盘做任何操作,调用File对象的某些方法时,才真正进行磁盘操作。

c.创建和删除文件

i.当File对象表示一个文件时,可以通过createNewFile()方法创建一个新文件,用delete()删除该文件。

d.Path

i.Java标准库还提供了一个Path对象,位于java.nio.file包。
ii.如果需要对目录进行复杂的拼接、遍历等,使用Path对象更方便。

3.InputStream

a.简介

i.Java库提供的最基本的输入流。
ii.不是接口,是抽象类,是所有输入流的超类。
iii.int read()方法:会读取输入流的下一个字节,并返回字节的int值,如果读到末尾,返回-1表示不能继续了。
iv.在计算机中,类似文件、网络端口这些资源,都是由操作系统统一管理的。应用程序在运行过程中,打开文件需要及时关闭,以便让操作系统及时释放资源。
v.InputStream和OutputStream都是通过close()方法关闭流,关闭流就会释放对应的底层资源。

vi.try(resource)的语法,编译器会自动关闭资源。实际上,编译器并不会特地为InputStream加上自动关闭, 编译器只看try(recource=...)中的对象是否实现了java.lang.AutoCloseable接口,实现了,就自动加上finally语句并调用close()方法。

b.缓冲

i.在读取流时,一次读取一个字节效率低,很多流支持一次性读取多个字节到缓冲区,利用缓冲区一次性读取多个字节效率就高很多。
ii.两个方法
        1.int read(byte[] b):读取若干字节并填充到byte[]数组,返回读取的字节数。
        2.int read(byte[] b, int off, int len):指定byte[]数组的偏移量和最大填充数。
iii.一次读取多个字节,需要先定义一个byte[]数组作为缓冲区,read()方法会尽可能多的读取字节到缓冲区,但不会超过缓冲区的大小。

c.阻塞

        i.调用InputStream的read()方法读取数据时,read()方法是阻塞的,即必须等read()方法返回后才能继续。读取IO流比执行普通代码,速度慢很多。

d.InputStream实现类

i.ByteArrayInputStream:把一个byte[]数组在内存中变成一个InputStream。

4.OutputStream

a.简介

i.Java标准库提供的最基本的输出流。
ii.不是接口,是抽象类,所有输出流的超类。
iii.void write(int b)方法:虽然是int参数,但是只会写入一个字节到输出流。
iv.提供了flush()方法,它的目的是将缓冲区的内容真正输出到目的地。
        1.出于效率考虑,操作系统并不是一个个字节输出,而是把输出的字节放到内存缓冲区(本质上是一个byte[]数组),等待缓冲区写满,一次性写入文件或网络。一次写1个字节和一次写1000个字节时间几乎一样,flush()方法能够强制把缓冲区内容输出。
        2.通常情况下,不需要我们调用,缓冲区写满后、close()方法关闭前,OutputStream会自动调用flush()方法。
3.某些情况下,需要我们手动调用flush()方法来强制输出缓冲区。

b.FileOutputStream

i.文件输出流,从内存输出内容到外部。
ii.一次性写入若干字节,调用write(byte[])来实现。
iii.try(resource)来保证OutputStream在无论是否发生IO错误的时候都能正确关闭资源。

c.阻塞

i.调用OutputStream的write()方法时,write()方法是阻塞的,即必须等write()方法返回后才能继续。输出IO流比执行普通代码,速度慢很多。

d.OutputStream实现类

i.ByteArrayOutputStream:把一个byte[]数组在内存中变成一个OutputStream。
ii.同时操作多个AutoCloseable资源时,在try(resource){...}语句中可以同时写出多个资源,用;隔开。

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

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

相关文章

【AIGC】ChatGPT提示词解析:如何生成爆款标题、节日热点文案与完美文字排版

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯情绪化的吸睛爆款标题提示词使用方法 💯紧跟节日热点选题文案提示词使用方法 💯高效文字排版技巧提示词使用方法 💯小结 &#x1f4af…

python-获取浏览器静态/动态素材

f12浏览器中 1:静态爬取 2.动态资源图片获取。斗鱼 3获取视频-抖音 一长串,最后一个http就是视频

Unity-物理系统-碰撞检测-物理材质

物理材质的作用:改变碰撞效果 因为碰撞的过程是相互的,所以在碰撞双方都要加相同的物理材质才能实现效果 物理材质创建 参数

【FPGA】IO电平标准

【FPGA】IO 电平标准 1 LVCMOS(低压CMOS)1.1 TTL、CMOS、LVTTL、LVCMOS逻辑电平定义1.2 ZYNQ-7000 PS、PL IO Level示例 2 LVTTL(低压TTL)3 HSTL(高速TTL)4 SSTL(高速)5 LVDS&#x…

Pytest测试实战|Conftest.py详解

Pytest测试实战 本文章主要详细地阐述下Pytest测试框架中Conftest.py特性。 Conftest.py实战 Fixture强大的特性在实际的工作中是非常有价值并且是实用的,这样可以根据需求,在对应的测试模块中编写Fixture函数来达到测试需求的目的。但是这样也产生了…

【面经合集】Java基础精选面试题(三)

最近,小编整理了不少Java领域面试题,如有需要,点击关注,回复【面试题】,即可下载。 31 、说说List,Set,Map三者的区别? List、Set、Map是三种不同数据结构的集合,它们的主要区别体现在存储方式…

Linux命令:用来列出当前系统内核加载的所有模块的工具lsmod详解

目录 一、概述 二、 使用方法 三、 输出格式 四、 示例 五、 相关命令 六、 高级用法 1、结合管道符 | 和 grep 命令 2、结合其他命令使用 七、应用和注意 一、概述 lsmod 是一个 Linux 命令行工具,用来列出当前内核加载的所有模块。这个命令对于了解哪些模…

分布式计算技术是什么?在数据集成值得作用?

数据是现代科技技术的基础,面对爆炸性数据的增长,要求计算能力要求更高、数据整合和处理更有效,如何应对数据集成带来的挑战?本文将探讨分布式计算技术在数据集成中的优化作用。 一 分布式计算技术。 定义:分布式计算…

《机器学习by周志华》学习笔记-神经网络-02感知机与多层网络

1、感知机 1.1、概念 感知机(Perceptron)由2层神经元模型组织,如下图所示: 「输入层神经元」接收外界输入信号后,传递给「输出层神经元 」 「输出层神经元」是「M-P神经元」,亦称「阈值逻辑单元(threshold logic unit)」 1.2、作用 「感知机」能够容易的实现逻辑「与…

初识前端监控

以下笔记来源:黑马程序员 背景 思考一下,我们的项目代码在上线之后是不是就不用管了呢? 并不是,作为前端开发工程师,我们是直接跟用户打交道的,一个应用的用户留存率跟这个应用的稳定性有很大的关系&…

NXP i.MX8系列平台开发讲解 - 4.2.1 摄像头篇(一) - 认识摄像头模组

专栏文章目录传送门:返回专栏目录 Hi, 我是你们的老朋友,主要专注于嵌入式软件开发,有兴趣不要忘记点击关注【码思途远】 文章目录 目录 1. 引言 2. 嵌入式系统中的CCM应用 3. 摄像头模组的基本组成 4. 摄像头模组的封装工艺 5. 摄像头…

GORM入门

ORM框架 什么是ORM ORM优缺点 GORM介绍 Github GORM 中文官方网站 安装 go get -u github.com/jinzhu/gorm连接数据库 连接不同的数据库都需要导入对应数据的驱动程序,GORM已经包装了一些驱动程序,只需要按如下方式导入需要的数据库驱动即可&#…

Python 方法传参详解

参数 位置参数 和关键字参数 data{error: str(e)}:传递给了 __init__ 方法中的 data 参数,表示需要返回给客户端的 JSON 数据。status500:通过 **kwargs 传递给了父类 HttpResponse,并设置了响应状态码为 500。 位置参数 和关键字…

redis Redis-Cluster常用命令与Redis性能监控

起因:随着项目的进一步推广,数据量的增大,直接访问mysql数据库获取数据所使用的时间越来越长,为解决当前主要矛盾,决定引入redis非关系型数据库作为缓存层,使得数据并不能直接命中数据库,减少访…

重生之我在代码随想录刷算法第十三天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

参考文献链接:代码随想录 本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。 110.平衡二叉树 力扣题目链接 解题思路 这道题目刚看到以为和二叉树的最大深度差不多,上来写了一堆迭代求深度的代码结果发现不对劲。 看了题…

非标精密五金加工的技术要求

非标精密五金加工在现代制造业中占据着重要地位,其对于产品的精度、质量和性能有着较高的要求。以下是时利和整理的其具体的技术要求: 一、高精度的加工设备 非标精密五金加工需要先进的加工设备来保证加工精度。例如,高精度的数控机床是必不…

【越学学糊涂的Linux系统】Linux指令篇(2)

一、echo指令: ✔️✔️在终端中显示文本内容或向文件中写入文本 Ⅰ.基本用法: 0x00打印字符串: 打印字符串/显示文本内容;可以用双引号作为文本内容⬇️⬇️更推荐用单引号 这里我将字符串打印出来了。和printf的功能一样&…

【Linux实践】实验五:用户和组群账户管理

【Linux实践】实验五:用户和组群账户管理 实验目的实验内容实验步骤及结果1. 创建用户2. 切换用户3. 修改用户4. 删除用户5. 创建组群6. 修改组群补充:删除组群 实验目的 1、掌握字符界面下用户账户的设置,包括命令useradd、usermod、userde…

深入解析 Apache Kylin

以下是关于 Kylin 概述 部分的内容,你可以在技术博客中使用: 1. Kylin 概述 什么是 Apache Kylin? Apache Kylin 是一个开源的分布式分析引擎,主要为大数据场景下的 OLAP(Online Analytical Processing)提…

利用echarts 显示图片信息

当前有个需求,需要对其进行相关统计,这里我们采用jquery3.6 与echarts.js 做相关图表,不解释,直接上代码吧 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"wid…