JAVA小知识29:IO流(上)
IO流是指在计算机中进行输入和输出操作的一种方式,用于读取和写入数据。IO流主要用于处理数据传输,可以将数据从一个地方传送到另一个地方,例如从内存到硬盘,从网络到内存等。IO流在编程中非常常见,特别是在文件操作和网络通信中。
一、IO流小知识
1.1、 IO流的分类
IO流主要分为以下几类:
-
按数据流方向分类:
- 输入流(Input Stream):从外部设备读取数据到内存,例如从文件读取数据。
- 输出流(Output Stream):将数据从内存写入到外部设备,例如将数据写入文件。

-
按数据类型分类:
-
字节流(Byte Stream):以字节为单位传输数据,常用于处理二进制数据。例如图片、视频等。常见的字节流类有:
- 输入字节流:
InputStream及其子类(如FileInputStream、BufferedInputStream等) - 输出字节流:
OutputStream及其子类(如FileOutputStream、BufferedOutputStream等)
- 输入字节流:
-
字符流(Character Stream):以字符为单位传输数据,常用于处理文本数据。例如文本文件。常见的字符流类有:
- 输入字符流:
Reader及其子类(如FileReader、BufferedReader等) - 输出字符流:
Writer及其子类(如FileWriter、BufferedWriter等)

- 输入字符流:
-
1.2、常见的IO流类
FileInputStream和FileOutputStream:用于读取和写入文件的字节流。FileReader和FileWriter:用于读取和写入文件的字符流。BufferedInputStream和BufferedOutputStream:带有缓冲区的字节流,可以提高读写效率。BufferedReader和BufferedWriter:带有缓冲区的字符流,可以提高读写效率。InputStreamReader和OutputStreamWriter:将字节流转换为字符流,通常用于处理编码问题。

二、字节流

2.1、字节输出流:FileOutputStream
操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。他的操作方法分为三步:
- 创建字节流输出对象
- 写入数据
- 释放资源
字节输出流的细节:
- 创建字节输出流对象
- 参数是字符串表示的路径或者是File对象都是可以的
- 如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
- 如果文件已经存在,则会清空文件
- 写数据
- write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
- 释放资源
- 每次使用完流之后都要释放资源
其成员方法如下:
| 方法名称 | 说明 |
|---|---|
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
操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来
步骤:
- 创建字节流输入对象
- 读入数据
- 释放资源
其成员方法如下:
| 方法名称 | 说明 |
|---|---|
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,所以我引入的Jedis相关版本也不是很高 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.2.0</version></dependency><…...
JVM专题二:Java如何进行编译的
编程语言分类 通常我们将编程语言分为高级语言和低级语言,通常高级语言因为其易用性和可移植性而被广泛使用,而低级语言在需要对硬件进行精细控制时非常有用,例如在嵌入式系统编程或操作系统开发中。 高级语言更接近人类语言,易于…...
道路元素位置和方向的坐标系统: 点 线 面 连接点
道路元素位置和方向的坐标系统: 下图道路元素在地球坐标系中的位置,该位置由三个坐标轴(x, y, z)组成的笛卡尔坐标系来确定。这种描述特别适用于三维建模和地理信息系统(GIS)中,其中道路被视为一个三维模型…...
二、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容器报错
项目场景: 通过docker启动Jenkins容器 问题描述 Jenkins容器启动失败,通过sudo docker logs -f jenkins命令 查看日志如下: 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 可以简单句子生成高质量图形,可以生成准确的文字,甚至可以支持中文。 stable diffusion 3 最初只支持API调用,最后把模型也完全开放了。Comfyui因为天生架构优势,第一时间跑起来了。既支持远程API模型调用&am…...
基于顺序表基础实现通讯录项目
基于顺序表基础实现通讯录项目 前言通讯录的实现 前言 Hello,亲爱的CSDN的小伙伴们,你们好!基于上一篇博客的基础上,今天我来带领大家实现通讯录项目,上一篇博客在这里哦!顺序表的实现 通讯录的实现 顺序表的实现在…...
加班的员工,循环的电池
宁德时代回应"896" 6月17日,宁德时代因内部宣告「实行 895 工作制,大干 100 天,外籍人员不强制」冲上热搜,虽后来辟谣 只是发出号召,并无强制员工实行"895"工作制,但舆论并无消退。 昨…...
windows安装Nacos并使用
Nacos(前身为阿里巴巴的Nacos Config和Nacos Discovery)是一个开源的动态服务发现、配置和服务管理平台,由阿里巴巴开发并维护。它提供了一种简单且易于使用的方式来管理微服务架构中的服务注册、发现和配置管理。 主要功能包括:…...
准备篇(三)网页相关知识
Java script小脚本 - 爬取 bilibili 表情Java script 小脚本 - 爬取 bilibili 表情 随便点开一个视频,注意这个页面 URL 对应的 HTML 代码中没有表情的代码, 需要先点一下评论区,然后再在这个页面 URL 对应的元素中找到表情所在的源码。(但是我不知道这个带表情 <pic…...
基于SSM的医药垃圾分类管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SSM的医药垃圾分类管理系统,java项目…...
web 应用防火墙的作用是什么
产品定义 Web应用防火墙(原生版)(CT-WAF,Web Application Firewall,简称WAF)为用户Web应用提供一站式安全防护,对Web业务流量进行智能全方位检测,有效识别恶意请求特征并防御&#…...
搜索框回车刷新表格(解决搜索框回车刷新页面问题)
问题:解决搜索框回车刷新页面问题 在 Vue 中,keyup.enter.native 用于监听键盘的回车事件并调用 handleQuery 方法。如果页面在按下回车键后整个刷新,这通常不是 Vue 组件内部行为导致的,而是可能由于以下原因: 表单默…...
洞察用户需求,Xinstall数据统计App让你的App运营如虎添翼
在互联网时代,App推广和运营面临着前所未有的挑战。流量红利逐渐衰退,用户获取成本不断攀升,如何确保在多变的互联网环境下,迅速搭建起能时刻满足用户需求的运营体系,成为众多企业急待解决的问题。今天,我们…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...

