当前位置: 首页 > news >正文

JAVA小知识29:IO流(上)

IO流是指在计算机中进行输入和输出操作的一种方式,用于读取和写入数据。IO流主要用于处理数据传输,可以将数据从一个地方传送到另一个地方,例如从内存到硬盘,从网络到内存等。IO流在编程中非常常见,特别是在文件操作和网络通信中。

一、IO流小知识

1.1、 IO流的分类

IO流主要分为以下几类:

  1. 按数据流方向分类

    • 输入流(Input Stream):从外部设备读取数据到内存,例如从文件读取数据。
    • 输出流(Output Stream):将数据从内存写入到外部设备,例如将数据写入文件。
    • 在这里插入图片描述
  2. 按数据类型分类

    • 字节流(Byte Stream):以字节为单位传输数据,常用于处理二进制数据。例如图片、视频等。常见的字节流类有:

      • 输入字节流:InputStream及其子类(如FileInputStreamBufferedInputStream等)
      • 输出字节流:OutputStream及其子类(如FileOutputStreamBufferedOutputStream等)
    • 字符流(Character Stream):以字符为单位传输数据,常用于处理文本数据。例如文本文件。常见的字符流类有:

      • 输入字符流:Reader及其子类(如FileReaderBufferedReader等)
      • 输出字符流:Writer及其子类(如FileWriterBufferedWriter等)
        在这里插入图片描述

1.2、常见的IO流类

  • FileInputStreamFileOutputStream:用于读取和写入文件的字节流。
  • FileReaderFileWriter:用于读取和写入文件的字符流。
  • BufferedInputStreamBufferedOutputStream:带有缓冲区的字节流,可以提高读写效率。
  • BufferedReaderBufferedWriter:带有缓冲区的字符流,可以提高读写效率。
  • InputStreamReaderOutputStreamWriter:将字节流转换为字符流,通常用于处理编码问题。
    在这里插入图片描述

二、字节流

在这里插入图片描述

2.1、字节输出流:FileOutputStream

操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。他的操作方法分为三步:

  1. 创建字节流输出对象
  2. 写入数据
  3. 释放资源

字节输出流的细节:

  1. 创建字节输出流对象
    • 参数是字符串表示的路径或者是File对象都是可以的
    • 如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
    • 如果文件已经存在,则会清空文件
  2. 写数据
    • write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
  3. 释放资源
    • 每次使用完流之后都要释放资源

其成员方法如下:

方法名称说明
public void write(int b)写入单个字节
public void write(byte[] b)写入字节数组
public void write(byte[] b, int off, int len)写入指定字节数组的一部分
public void close()关闭文件输出流
protected void finalize()确保文件输出流被关闭
public FileChannel getChannel()返回与此文件输出流相关的通道
public void flush()刷新此文件输出流的缓冲

演示代码如下:

public static void main(String[] args) throws IOException {// 创建对象就相当于创建一个通路 只有通路才能输入输出数据FileOutputStream fos = new FileOutputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");fos.write(97);fos.close();
}

在这里插入图片描述

public static void main(String[] args) throws IOException {byte[] buf = {'a', 'b', 'c', 'd', 'e', 'f'};FileOutputStream fos = new FileOutputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");fos.write(buf);// 数组名 起始索引 长度fos.write(buf,1,2);fos.close();
}

在这里插入图片描述

2.2、换行与续写

换行符:

  • window:“\r\n”
  • linux::"\n"
  • mac::"\r"
public static void main(String[] args) throws IOException {byte[] buf = {'a', 'b', 'c', 'd', 'e', 'f'};FileOutputStream fos = new FileOutputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");fos.write(buf);String wrap = "\r\n";fos.write(wrap.getBytes());// 数组名 起始索引 长度fos.write(buf,1,2);fos.close();
}

在这里插入图片描述

我们说了FileOutputStream创建对象,如果文件已经存在,则会清空文件。但是在我们创建FileOutputStream对象的时候,除了地址参数,其实还有一个续写参数:
在这里插入图片描述
只不过他的默认值是false,只要改为true,就进入到了续写模式。
在这里插入图片描述

2.3、字节输入流:FileInputStream

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
步骤:

  1. 创建字节流输入对象
  2. 读入数据
  3. 释放资源
    在这里插入图片描述

其成员方法如下:

方法名称说明
public int read()从输入流读取一个字节
public int read(byte[] b)从输入流读取一定数量的字节,并将其存储到缓冲区数组 b
public int read(byte[] b, int off, int len)从输入流中读取最多 len 个字节的数据,并将其存储到缓冲区数组 b 中,从偏移量 off 开始存储
public long skip(long n)跳过和丢弃输入流中最多 n 个字节的数据
public int available()返回可以从此输入流中读取的字节数
public void close()关闭此文件输入流并释放与该流关联的所有系统资源
protected void finalize()确保在垃圾回收时关闭文件输入流
public FileChannel getChannel()返回与此文件输入流相关的通道
public FileDescriptor getFD()返回文件描述符,表示与此文件输入流相关的连接

根据上面的读取细节,我们可以写一个循环读取:

public static void main(String[] args) throws IOException {FileInputStream ios = new FileInputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");int a;while ((a=ios.read())!=-1){System.out.println((char)a);}ios.close();
}

在这里插入图片描述
我们再来看一种错误的写法:

public static void main(String[] args) throws IOException {FileInputStream ios = new FileInputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");int a;while (ios.read()!=-1){a = ios.read();System.out.println((char)a);}ios.close();
}

在这里插入图片描述

这样的写法自然是错的,还记得我们之前学过的迭代器吗?每一个next都会移动指针,这里也是一样的,每一个read也会移动指针,第一次移动是判断,第二次移动是赋值,所以一次循环会移动两次指针。

三、文件拷贝

第一种方法:

public static void main(String[] args) throws IOException {FileInputStream ios = new FileInputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");FileOutputStream fos = new FileOutputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\b.txt");int a;while ((a=ios.read())!=-1){fos.write(a);}ios.close();fos.close();
}

在这里插入图片描述
这种方法效率非常的慢,来看第二种方法:这种方法非常的好。

public static void main(String[] args) throws IOException {FileInputStream ios = new FileInputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\a.txt");FileOutputStream fos = new FileOutputStream("C:\\Users\\password123456\\Desktop\\资料\\IO流\\b.txt");int len;byte[] buffer = new byte[1024 * 1024 * 5];while ((len = ios.read(buffer))!=-1){fos.write(buffer,0,len);}fos.close();ios.close();
}

相关文章:

JAVA小知识29:IO流(上)

IO流是指在计算机中进行输入和输出操作的一种方式,用于读取和写入数据。IO流主要用于处理数据传输,可以将数据从一个地方传送到另一个地方,例如从内存到硬盘,从网络到内存等。IO流在编程中非常常见,特别是在文件操作和…...

大学生毕业季,寄物流快递避雷指南

随着毕业季的来临,大学生们纷纷开始整理自己的行李,准备离开校园,踏入社会。 在这个过程中,寄送快递成为了一个不可或缺的环节。然而,在寄送快递的过程中,如果不注意一些细节,很容易遭遇各种“…...

如何提高项目风险的处理效率?5个重点

提高项目风险的处理效率,有助于迅速识别和应对风险,减少风险导致的延误,降低成本,提升项目质量,确保项目按时交付。如果项目风险处理效率较低,未能及时发现和处理风险,导致问题累积,…...

ZNB40 矢量网络分析仪

ZNB40 矢量网络分析仪 100kHz至40GHz的宽频率范围,具有四个端口和附加信号发生器 概述 R&SZNB40 提供 100 kHz 至 40 GHz 的宽频率范围,具有四个端口和附加信号发生器。 罗德与施瓦茨带四个端口和附加内部信号源的 40 GHz 中档矢量网络分析仪&…...

ingress代理前后端服务跨域

一、前言 ingress对于前后端服务的代理有不同的方式可以实现,前后端服务可以通过不同的域名实现流量的分流策略,不过这需要解决前后端域名不同产生的跨域问题,也可以通过不同的path实现流量的分流策略,该方式不会产生跨域的问题 …...

Python 使用 Thick 方式连接 Oracle Database BaseDB 23ai

Python 使用 Thick 方式连接 Oracle Database BaseDB 23ai 1. 下载Basic.zip 和SQL*Plus(.zip)2. 配置环境变量3. 连接 23ai 1. 下载Basic.zip 和SQL*Plus(.zip) 到 https://www.oracle.com/database/technologies/instant-clien…...

Java操作Redis(通过Jedis)

一、环境搭建 这里我使用的SpringBoot版本是2.6.3&#xff0c;所以我引入的Jedis相关版本也不是很高 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.2.0</version></dependency><…...

JVM专题二:Java如何进行编译的

编程语言分类 通常我们将编程语言分为高级语言和低级语言&#xff0c;通常高级语言因为其易用性和可移植性而被广泛使用&#xff0c;而低级语言在需要对硬件进行精细控制时非常有用&#xff0c;例如在嵌入式系统编程或操作系统开发中。 高级语言更接近人类语言&#xff0c;易于…...

道路元素位置和方向的坐标系统: 点 线 面 连接点

道路元素位置和方向的坐标系统: 下图道路元素在地球坐标系中的位置&#xff0c;该位置由三个坐标轴&#xff08;x, y, z&#xff09;组成的笛卡尔坐标系来确定。这种描述特别适用于三维建模和地理信息系统&#xff08;GIS&#xff09;中&#xff0c;其中道路被视为一个三维模型…...

二、Docker常用命令

一、帮助启动类命令 1、启动docker [rootlocalhost ~]# systemctl start docker 2、停止docker [rootlocalhost ~]# systemctl stop docker 3、重启docker [rootlocalhost ~]# systemctl stop docker 4、查看docker状态 [rootlocalhost ~]# systemctl status docker 5、开机自…...

通过docker启动Jenkins容器报错

项目场景&#xff1a; 通过docker启动Jenkins容器 问题描述 Jenkins容器启动失败&#xff0c;通过sudo docker logs -f jenkins命令 查看日志如下&#xff1a; touch: cannot touch ‘/var/jenkins_home/copy_reference_file.log’: Permission denied Can not write to /var…...

webui automatic1111上可以跑stable diffusion 3的方法

stable diffusion 3 可以简单句子生成高质量图形&#xff0c;可以生成准确的文字&#xff0c;甚至可以支持中文。 stable diffusion 3 最初只支持API调用&#xff0c;最后把模型也完全开放了。Comfyui因为天生架构优势&#xff0c;第一时间跑起来了。既支持远程API模型调用&am…...

基于顺序表基础实现通讯录项目

基于顺序表基础实现通讯录项目 前言通讯录的实现 前言 Hello,亲爱的CSDN的小伙伴们&#xff0c;你们好&#xff01;基于上一篇博客的基础上&#xff0c;今天我来带领大家实现通讯录项目&#xff0c;上一篇博客在这里哦&#xff01;顺序表的实现 通讯录的实现 顺序表的实现在…...

加班的员工,循环的电池

宁德时代回应"896" 6月17日&#xff0c;宁德时代因内部宣告「实行 895 工作制&#xff0c;大干 100 天&#xff0c;外籍人员不强制」冲上热搜&#xff0c;虽后来辟谣 只是发出号召&#xff0c;并无强制员工实行"895"工作制&#xff0c;但舆论并无消退。 昨…...

windows安装Nacos并使用

Nacos&#xff08;前身为阿里巴巴的Nacos Config和Nacos Discovery&#xff09;是一个开源的动态服务发现、配置和服务管理平台&#xff0c;由阿里巴巴开发并维护。它提供了一种简单且易于使用的方式来管理微服务架构中的服务注册、发现和配置管理。 主要功能包括&#xff1a;…...

准备篇(三)网页相关知识

Java script小脚本 - 爬取 bilibili 表情Java script 小脚本 - 爬取 bilibili 表情 随便点开一个视频,注意这个页面 URL 对应的 HTML 代码中没有表情的代码, 需要先点一下评论区,然后再在这个页面 URL 对应的元素中找到表情所在的源码。(但是我不知道这个带表情 <pic…...

基于SSM的医药垃圾分类管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的医药垃圾分类管理系统,java项目…...

web 应用防火墙的作用是什么

产品定义 Web应用防火墙&#xff08;原生版&#xff09;&#xff08;CT-WAF&#xff0c;Web Application Firewall&#xff0c;简称WAF&#xff09;为用户Web应用提供一站式安全防护&#xff0c;对Web业务流量进行智能全方位检测&#xff0c;有效识别恶意请求特征并防御&#…...

搜索框回车刷新表格(解决搜索框回车刷新页面问题)

问题&#xff1a;解决搜索框回车刷新页面问题 在 Vue 中&#xff0c;keyup.enter.native 用于监听键盘的回车事件并调用 handleQuery 方法。如果页面在按下回车键后整个刷新&#xff0c;这通常不是 Vue 组件内部行为导致的&#xff0c;而是可能由于以下原因&#xff1a; 表单默…...

洞察用户需求,Xinstall数据统计App让你的App运营如虎添翼

在互联网时代&#xff0c;App推广和运营面临着前所未有的挑战。流量红利逐渐衰退&#xff0c;用户获取成本不断攀升&#xff0c;如何确保在多变的互联网环境下&#xff0c;迅速搭建起能时刻满足用户需求的运营体系&#xff0c;成为众多企业急待解决的问题。今天&#xff0c;我们…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...