IO流 详细介绍

news2024/12/23 13:08:11

一、IO流概述

1.IO:输入(Input读取数据)/输出(Output写数据)

2.流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输IO流就是用来处理设备间数据传输问题的。

3.常见的应用:文件上传、下载、复制等。

文件通常是由一连串的字节或字符构成,组成文件的字节序列称为字节流,组成文件的字符序列称为字符流。Java中根据流的方向可以分为输入流和输出流。输入流是将文件或其它输入设备的数据加载到内存的过程;输出流恰恰相反,是将内存中的数据保存到文件或其他输出设备,详见下图:

1648290969(1).png

 二、IO流分类

2.1  根据数据流向分类:  

输入流:读数据  将硬盘中的数据读取到内存中  

输出流:写数据  将程序中的数据写入到硬盘中

1648291002(1).png

2.2  按照数据类型来分:

字节流: 字节输入流/字节输出流  

字符流: 字符输入流/字符输出流

2.3  IO流应用场景:  

纯文本文件,优先使用字符流  

图片、视频、音频等二进制文件,优先使用字节流  

不确定文件类型,优先使用字节流,字节流是万能的流

2.4  InputStream(字节输入流)、OutputStream(字节输出流)、Reader(字符输入流)、Writer(字符输出流)

2.4.1  InputStream(字节输入流)

InputStream是字节输入流,InputStream是一个抽象类,所有继承了InputStream的类都是字节输入流,主要了解以下子类即可:

1648291105(1).png

主要方法介绍: 

void

close()
关闭此输入流并释放与该流关联的所有系统资源。

abstract int

read()
从输入流读取下一个数据字节。(多次调用会按顺序依次读取)返回-1表示读取完毕

int

read(byte[] b)
从输入流中读取一定数量的字节并将其存储在缓冲区数组 b 中。

int

read(byte[] b, int off, int len)
将输入流中最多 len 个数据字节读入字节数组。

2.4.2  OutputStream(字节输出流)

1648291222(1).png

主要方法介绍: 

void

close()
关闭此输出流并释放与此流有关的所有系统资源。

void

flush()
刷新此输出流并强制写出所有缓冲的输出字节。

void

write(byte[] b)
将 b.length 个字节从指定的字节数组写入此输出流。

void

write(byte[] b, int off, int len)
将指定字节数组中从偏移量 off 开始的 len 个字节写入此输出流。

abstract void

write(int b)
将指定的字节写入此输出流。

2.4.3  Reader(字符输入流)

所有继承了Reader都是字符输如流

1648291279(1).png

主要方法介绍:

abstract void

close()
关闭该流。

int

read()
读取单个字符。(多次调用会按顺序依次读取)返回-1表示读取完毕

int

read(char[] cbuf)
将字符读入数组。

abstract int

read(char[] cbuf, int off, int len)
将字符读入数组的某一部分。

 2.4.4  Writer(字符输出流)

所有继承了Writer都是字符输出流

1648291330(1).png

主要方法介绍:

Writer

append(char c)
将指定字符追加到此 writer。

abstract void

close()
关闭此流,但要先刷新它。

abstract void

flush()
刷新此流。

void

write(char[] cbuf)
写入字符数组。

abstract void

write(char[] cbuf, int off, int len)
写入字符数组的某一部分。

void

write(int c)
写入单个字符。

void

write(String str)
写入字符串。

void

write(String str, int off, int len)
写入字符串的某一部分。

 三、文件流

3.1  FileInputStream(文件字节输入流)

FileInputStream:从文件系统中的文件获取输入字节;

FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件有文件系统中的路径名name命名;

步骤:

1.创建字节输入流对象

2.调用字节输入流对象的读数据方法

3.释放资源

字节流读取数据:

方法名称

说明

int read()

从该输入流读取一个字节数据,返回值为-1时说明文件读取完毕(多次调用会按顺序依次读取)

InputStream in = new FileInputStream("d:/a.txt");

int c = 0;
while((c = in.read()) != -1){
    System.out.println(c);
}

in.close();

上述代码在执行时:如果在执行in.read()时没有读取到末尾,即文件还有可读取的数据,in.read()方法会返回下一个可用字节的整数值(0-255之间)。如果已经读取到了文件末尾,in.read()方法会返回-1。

3.2  FileOutputStream(文件字节输出流)

字节流写入数据常用的三种方式: 

方法名称

说明

void write(int b)

将指定的字节写入此文件输出流 一次写一个字节数据

void write(byte[] b)

将 b.length字节从指定的字节数组写入此文件输出流 一次写一个字节数组数据

void write(byte[] b, int off, int len)

将 len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流 一次写一个字节数组的部分数据

void write(byte[] b, int off, int len)是Java中OutputStream类的一个方法,用于将指定字节数组中的一部分数据写入输出流。

参数解释:

  • b:要写入的字节数组。
  • off:写入的起始偏移量,即从数组的第off个位置开始写入数据。
  • len:要写入的字节数,即写入b数组中从off位置开始的连续len个字节。

如何追加写入数据:

字节流写入数据通过 new FileOutputStream(new File("mayikt.txt"), true); 表示追加写入数据。 如果第二个参数为true,则字节流写入文件的末尾。此方法通过在构造FileOutputStream对象时将第二个参数设置为true来实现追加写入。

InputStream in = new FileInputStream("d:/a.txt");
OutputStream out = new FileOutputStream("d:/aa.txt");

int c = 0;
while((c = in.read()) != -1){
    out.write(c);
}

in.close();
out.close();

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

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

相关文章

SQL两张表数据对比

表1: 表2: 1、查询两表的数据差异: # 查询表1中有但表2没有的数据 SELECT DATA FROM data1 WHERE ( DATA ) NOT IN ( SELECT DATA FROM data2 );# 查询表2中有但表…

MySQL系统变量 会话变量,用户变量

系统变量 分类 全局系统变量需要添加 global 关键字,有时把全局系统变量简称 全局变量 会话系统变量需要添加 session 关键字,有时也把会话系统变量称为 local 变量 局部变量 如果不写(global、session)默认会话级别。 静态变量在…

LeetCode[56]合并区间

难度:Medium 题目: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1&…

Practices11|41. 缺失的第一个正数(数组)、73. 矩阵置零(矩阵)

41. 缺失的第一个正数(数组) 1.题目: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出&#xf…

用于智能图像处理的计算机视觉和 NLP

莫斯科,神秘之城...(这张照片由伊戈尔沙巴林提供) 一、说明 如今,每个拥有智能手机的人都可能成为摄影师。因此,每天都有大量新照片出现在社交媒体、网站、博客和个人照片库中。尽管拍照的过程可能非常令人兴奋&#x…

在ubuntu+cpolar+rabbitMQ环境下,实现mq服务端远程访问

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 前言 RabbitMQ是一个在 AMQP(高级消息队列协议)基…

零信任架构演进与实践:探讨零信任安全模型在不断发展的背景下的最新趋势和实际应用案例

随着信息技术的迅猛发展,企业的网络安全面临着日益复杂的挑战。传统的网络安全模型已经不再适用于如今的威胁环境,因此,零信任架构应运而生。零信任安全模型基于"从内部出发,不信任网络,不信任用户"的理念&a…

FirmAE 工具安装(解决克隆失败 网络问题解决)

FirmAE官方推荐使用Ubuntu 18.04系统进行安装部署,FirmAE工具的安装部署十分简单,只需要拉取工具仓库后执行安装脚本即可。 首先运行git clone --recursive https://kgithub.com/pr0v3rbs/FirmAE命令 拉取FirmAE工具仓库,因为网络的问题&…

非常详细的 Ceph 介绍、原理、架构

1. Ceph架构简介及使用场景介绍 1.1 Ceph简介 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。在经过…

排序链表00

题目链接 排序链表 题目描述 注意点 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序 解答思路 使用归并排序对链表进行排序,保证时间复杂度为 O(n log n)相对于数组的归并排序,链表的中间节点需要遍历才能找到&#xff0…

idea快速生成Serializable序列化UID的方法

①在idea的File–>Settings–>Editor–>Inspections里搜索 Serializable class without serialVersionUID 记得点Apply和OK

opencv进阶08-K 均值聚类cv2.kmeans()介绍及示例

K均值聚类是一种常用的无监督学习算法,用于将一组数据点分成不同的簇(clusters),以便数据点在同一簇内更相似,而不同簇之间差异较大。K均值聚类的目标是通过最小化数据点与所属簇中心之间的距离来形成簇。 当我们要预测…

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序)

参考文章: re学习笔记(27)攻防世界-re-csaw2013reversing2_Forgo7ten的博客-CSDN博客攻防世界逆向入门题之csaw2013reversing2_沐一 林的博客-CSDN博客 三种做法 1、ida静态分析修改指令 main函数反编译的代码 由于运行之后的是乱码&…

【C++ 记忆站】缺省参数

文章目录 缺省参数的概念缺省参数的分类1、全缺省参数2、半缺省参数 缺省参数实际应用场景 缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参 正常调用一…

MySQL 安装 audit 日志审计插件

下载 我的MySQL版本是 5.7.37的,用的是日志审计插件(audit-plugin)是1.1.10的,大家可以对应自己版本去下载。 https://github.com/trellix-enterprise/mysql-audit/releases 配置 1、进入到/opt目录下载 audit,可以…

《Zookeeper》源码分析(十三)之 投票管理器

目录 QuorumVerifier数据结构构造函数containsQuorum() SyncedLearnerTracker功能 QuorumVerifier QuorumVerifier用于保存集群选举服务器信息以及选举期间判断投票是否过半,它的创建过程如下: 默认创建的是它的实现类QuorumMaj 数据结构 构造函数 从…

ElasticSearch的客户端操作

ElasticSearch的客户端操作 1、客户端介绍 官方文档地址: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 实际开发中,有多种方式操作Elasticsearch: 客户端工具:发送http请求(RESTful风格)操作…

C语言入门_Day 6布尔数与比较运算

目录 前言 1.布尔数 2.比较运算 3.易错点 4.思维导图 前言 除了算术计算以外,编程语言中还会大量使用比较运算,并会根据比较运算的结果是“真”还是“假”,来执行不同的代码。 当你想买一杯奶茶,准备支付的时候,支…

Reis过期删除策略

介绍 在Redis中,我们可以为键值对设置有效期,现在面临一个问题,如果一个键值对过期了,那么我们应该怎么删除呢? 我们目前有三种方案: 定时删除:在设置键的过期时间的同时,为此键设…

特殊链表(循环单链表,循环双链表,静态链表)

目录 1.循环单链表的初始化 2.循环双链表 3. 静态链表 (1)静态链表的初始化 (2)静态链表的插入 1.循环单链表的初始化 typedef int ElemType; typedef struct LNode{ElemType data;struct LNode *next;}LNode,*LinkList;bool InitList(LinkList &L) {L(LNode*)malloc(…