IO流概述
🏡个人主页 :@ 守夜人st
🚀系列专栏:Java
…持续更新中敬请关注…
🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点
目录
- IO流概述
- IO 流的分类
- 总结流的四大类
- 字节流的使用
- 文件字节输入流:FileInputStream
- 文件字节输出流:FileOutputStream
- 流的关闭与刷新
- 文件拷贝
- 资源释放
- try-catch-finally
- try-with-resource
- 字符流的使用
- 文件字符输入流(FileReader)
- 一次读取一个字符
- 一次读取一个字符数组
- 文件字符输出流(FileWriter)
- 流的关闭与刷新
- 总结:
IO流概述
IO流也称为输入、输出流,用于数据的读写。
- I 表示input,是数据从硬盘文件读入到内存的过程,称之为输入,负责读。
- O 表示output,是内存程序的数据从内存写入到硬盘文件的过程,称之输出,负责写。
IO 流的分类
按流的方向分:输入流、输出流
按流中的数据最小单位分:字节流、字符流
总结流的四大类
- 字节输入流(InputStream):以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流成为字节输入流
- 字节输出流(OutputStream):以内存为基准,把内存中的数据以字节写入到磁盘文件或者网络中去的流称为字节输出流
- 字符输入流(Reader):以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流
- 字符输出流(Writer):以内存为基准,把内存中的数据以字符写入到磁盘文件或网络介质中去的流称为字符输出流
字节流的使用
文件字节输入流:FileInputStream
作用:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去
| 构造器 | 说明 |
|---|---|
| public FileInputStream(File file) | 创建字节输入流管道与源文件对象接通 |
| public FileInputStream (String pathname) | 创建字节输入流管道与源文件对象接通 |
| 方法名称 | 说明 |
|---|---|
| public int read() | 每次读取一个字节返回,如果字节已经没有可读的返回 -1 |
| public int read(byte[] buffer) | 每次读取一个字节数组返回,如果字节已经没有可读的返回 -1 |
每次读取一个字节
package com.shouyeren.oop.api.byte_stream;import java.io.FileInputStream;
import java.io.InputStream;public class FileInputStreamDemo1 {public static void main(String[] args) throws Exception {//创建一个文件字节输入流管道与源文件连通InputStream fileInputStream = new FileInputStream("src/data.txt");//每读取一个字节返回/*int b1 = fileInputStream.read();System.out.println((char) b1);int b2 = fileInputStream.read();System.out.println((char) b2);int b3 = fileInputStream.read();System.out.println((char) b3);*///使用循环改进//无法避免中文读取乱码int b;while ((b = fileInputStream.read()) != -1){System.out.print((char) b);}}
}
每次读取一个字节数组
package com.shouyeren.oop.api.byte_stream;import java.io.FileInputStream;
import java.io.InputStream;public class FileInputStreamDemo2 {public static void main(String[] args) throws Exception {//创建一个文件字节输入流管道与源文件连通InputStream fileInputStream = new FileInputStream("src/data.txt");//定义一个字符数组byte[] buffer = new byte[3];int len;while ((len = fileInputStream.read(buffer)) != -1){System.out.print(new String(buffer,0,len));}}
}
一次读取全部字节
- 定义一个与文件一样的字节数组,一次性读取完全部的字节
- 如果文件过大,字节数组可能引起内存溢出
package com.shouyeren.oop.api.byte_stream;import java.io.FileInputStream;
import java.io.InputStream;public class FileInputStreamDemo3 {public static void main(String[] args) throws Exception {//创建一个文件字节输入流管道与源文件连通InputStream fileInputStream = new FileInputStream("src/data.txt");//readAllBytes()是jdk9才出现的方法byte[] buffer = fileInputStream.readAllBytes();System.out.println(new String(buffer));}
}
文件字节输出流:FileOutputStream
| 方法名称 | 说明 |
|---|---|
| public vido write(int a) | 写一个字节 |
| public void write(byte[] buffer) | 写一个字节数组 |
| public void write(byte[] buffer,int pos,int len) | 写一个字节数组的一部分 |
流的关闭与刷新
| 方法 | 说明 |
|---|---|
| flush() | 刷新流,还可以继续写数据 |
| close() | 关闭流,释放资源,但是在关闭前会先刷新流,一旦关闭就不能在写数据 |
package com.shouyeren.oop.api.byte_stream;import java.io.FileOutputStream;
import java.io.OutputStream;/*public FileOutputStream(File file,boolean append):创建一个追加数据的输出流管道流向目标文件对象
public FileOutputStream(String file,boolean append):创建一个追加数据的输出流管道流向目标文件路径*/
public class OutputStreamDemo01 {public static void main(String[] args) throws Exception {//清空原来的数据,写入新数据OutputStream os = new FileOutputStream("src/outputTest.txt");//写入一个字节os.write('a');//aos.write(98);//bos.write("\r\n".getBytes());//换行//中文写入乱码 UTF-8中一个中文字符占三个字节//os.write('男');//7//写入一个字节数组byte[] buffer = {'a',97,98,99};os.write(buffer);os.write("\r\n".getBytes());//写入中文byte[] buffer1 = "你好Java".getBytes();os.write(buffer1);os.write("\r\n".getBytes());/*//刷新流os.flush();*///关闭流 关闭之前先刷新os.close();}
}
文件拷贝
package com.shouyeren.oop.api.byte_stream;import java.io.*;/*** 目标:实现文件的拷贝(支持一切文件类型)*/
public class CopyDemo01 {public static void main(String[] args) {try {//1.创建一个字节输入流管道与源文件接通InputStream in = new FileInputStream("C:\\Users\\shouyeren\\Desktop\\20221227_114837.m4a");//2.创建一个字节输出流管道与源文件接通OutputStream out = new FileOutputStream("src/new.m4a");//3.定义一个字节数组转移数据byte[] buffer = new byte[1024];int len; //记录每次读取的字节数while ((len = in.read(buffer)) != -1){out.write(buffer,0,len);}System.out.println("文件拷贝完成!");//4.关闭流out.close();in.close();} catch (Exception e) {e.printStackTrace();}}
}
任何文件的底层都是字节,拷贝是一字不漏的转移字节,只要前后文件格式,编码一致没有任何问题。
资源释放
try-catch-finally
-
finally:在异常处理时提供finally块来执行所有清除操作,比如IO流的释放资源
-
特点:被finally控制的语句最终一定会执行,除非JVM退出
-
异常处理格式:try…catch…finally
try{FileOutputStream fos = new FileOutputStream("a.txt");fos.write(97);}catch(IOExceptiopn e){e.printStackTrace(); }finally{fos.close(); }
try-with-resource
finally虽然可以释放资源,但是释放资源的代码过去繁琐
InputStream is = null;
OutputStream os = null;
try{
...
}catch(Exception e){e.printStackTrace();
}finally{try{if(os != null) os.close();}catch(Exception e){e,printStackTrace();}try{if(is != null) is.close();}catch(Exception e){e.printStackTrace();}
}
JDK7改进方案
try(定义流对象){可能出现异常的代码
}catch(异常类名 变量名){异常的处理代码
}
JDK9改进方案
定义输入流对象;
定义输出流对象;
try(输入流对象;输出流对象){可能出现异常的代码块;
}catch(异常类名 变量名){异常的处理代码
}
字符流的使用
文件字符输入流(FileReader)
作用:以内存为基准,把磁盘中的数据以字符的形式读取到内存中去
| 构造器 | 说明 |
|---|---|
| public FileReader(File file) | 创建字符输入流管道与源文件对象接通 |
| public FileReader(String pathname) | 创建字符输入流管道与源文件路径接通 |
| 方法名称 | 说明 |
|---|---|
| public int read() | 每次读取一个字符返回,如果字符已经没有可读的返回 -1 |
| public int read(char[] buffer) | 每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回 -1 |
一次读取一个字符
字符流的好处,每次读取一个字符存在什么问题?
- 读取中文字符不会出现乱码(代码和文件编码一致)
- 性能较慢
一次读取一个字符数组
每次读取一个字符数组的优势:读取的性能得到了提升
文件字符输出流(FileWriter)
| 构造器 | 说明 |
|---|---|
| public FileWriter(File file) | 创建字符输出流管道与源文件对象接通 |
| public FileWriter(File file,boolean append) | 创建字符输出流管道与源文件对象接通,可追加数据 |
| public FileWriter(String filepath) | 创建字符输出流管道与源文件路径接通 |
| public FileWriter(String filepath,boolean append) | 创建字符输出流管道与源文件路径接通,可追加数据 |
| 方法名称 | 说明 |
|---|---|
| void write(int c) | 写一个字符 |
| void write(char[] cbuf) | 写入一个字符数组 |
| void write(char[] cbuf,int off,int len) | 写入字符数组的一部分 |
| void write(String str) | 写一个字符串 |
| void write(String str,int off,int len) | 写一个字符串的一部分 |
流的关闭与刷新
与字节流类似,需要关流!!!
总结:
字节流与字符流如何选择使用?
- 字节流适合做一切文件数据的拷贝
- 字节流不适合读取中文内容输出
- 字符流适合做文本文件的操作

相关文章:
IO流概述
🏡个人主页 : 守夜人st 🚀系列专栏:Java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 目录IO流概述IO 流的分类总结流的四大类字…...
【node.js】node.js的安装和配置
文章目录前言下载和安装Path环境变量测试推荐插件总结前言 Node.js是一个在服务器端可以解析和执行JavaScript代码的运行环境,也可以说是一个运行时平台,仍然使用JavaScript作为开发语言,但是提供了一些功能性的API。 下载和安装 Node.js的官…...
Python优化算法—遗传算法
Python优化算法—遗传算法一、前言二、安装三、遗传算法3.1 自定义函数3.2 遗传算法进行整数规划3.3 遗传算法用于旅行商问题3.4 使用遗传算法进行曲线拟合一、前言 优化算法,尤其是启发式的仿生智能算法在最近很火,它适用于解决管理学,运筹…...
数据埋点(Data buried point)的应用价值剖析
一、什么是数据埋点?数据埋点指在应用中特定的流程中收集一些信息,用来跟踪应用使用的状况,后续用来进一步优化产品或是提供运营的数据支撑。比如访问数(Visits),访客数(Visitor),停…...
一文弄懂硬链接、软链接、复制的区别
复制 命令:cp file1 file2 作用:实现对file1的一个拷贝。 限制:可以跨分区,文件夹有效。 效果:修改file1,对file2无影响;修改file2,对file1无影响。删除file1,对file…...
界面组件Telerik ThemeBuilder R1 2023开创应用主题研发新方式!
Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供最完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET包含一个完…...
在FederatedScope 如何查看clientserver之间的传递的参数大小(通讯量)? 对源码的探索记录
在FederatedScope 如何查看client/server之间的传递的参数大小(通讯量)? 对源码的探索记录 背景需求 想给自己的论文补一个通讯开销对比实验:需要计算出client和server之间传递的信息(例如,模型权重、embedding)总共…...
2023爱分析 · 数据科学与机器学习平台厂商全景报告 | 爱分析报告
报告编委 黄勇 爱分析合伙人&首席分析师 孟晨静 爱分析分析师 目录 1. 研究范围定义 2. 厂商全景地图 3. 市场分析与厂商评估 4. 入选厂商列表 1. 研究范围定义 研究范围 经济新常态下,如何对海量数据进行分析挖掘以支撑敏捷决策、适应市场的快…...
20230215_数据库过程_高质量发展
高质量发展 —一、运营结果 SQL_STRING:‘delete shzc.np_rec_lnpdb a where exists (select * from tbcs.v_np_rec_lnpdbbcv t where a.telnumt.telnum and a.outcarriert.OUTCARRIER and a.incarriert.INCARRIER and a.owncarriert.OWNCARRIER and a.starttimet.STARTTIME …...
【百度 JavaScript API v3.0】LocalSearch 位置检索、Autocomplete 结果提示
地名检索移动到指定坐标 需求 在输入框中搜索,在下拉列表中浮动,右侧出现高亮的列表集。选中之后移动到指定坐标。 技术点 官网地址: JavaScript API - 快速入门 | 百度地图API SDK 开发文档:百度地图JSAPI 3.0类参考 实现 …...
运用Facebook投放,如何制定有效的竞价策略?
广告投放中,我们经常会遇到一个问题,就是不知道什么样的广告适合自己的业务。其实,最简单的方法就是根据我们业务本身进行定位并进行投放。当你了解了广告主所处行业及目标受众后,接下来会针对目标市场进行搜索和定位(…...
大数据框架之Hadoop:HDFS(五)NameNode和SecondaryNameNode(面试开发重点)
5.1NN和2NN工作机制 5.1.1思考:NameNode中的元数据是存储在哪里的? 首先,我们做个假设,如果存储在NameNode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低。因此&am…...
计算机网络 - 1. 体系结构
目录概念、功能、组成、分类概念功能组成分类分层结构概念总结OSI 七层模型应用层表示层会话层传输层网络层数据链路层物理层TCP/IP 四层模型OSI 与 TCP/IP 相同点OSI 与 TCP/IP 不同点为什么 TCP/IP 去除了表示层和会话层五层参考模型概念、功能、组成、分类 概念 …...
银行业上云进行时,OLAP 云服务如何解决传统数仓之痛?
本文节选自《中国金融科技发展概览:创新与应用前沿》,从某国有大行构建大数据云平台的实践出发,解读了 OLAP 云服务如何助力银行实现技术平台化、组件化和云服务化,降低技术应用门槛,赋能业务创新。此外,本…...
特定领域知识图谱融合方案:文本匹配算法之预训练Simbert、ERNIE-Gram单塔模型等诸多模型【三】
特定领域知识图谱融合方案:文本匹配算法之预训练模型SimBert、ERNIE-Gram 文本匹配任务在自然语言处理中是非常重要的基础任务之一,一般研究两段文本之间的关系。有很多应用场景;如信息检索、问答系统、智能对话、文本鉴别、智能推荐、文本数据去重、文本相似度计算、自然语…...
【2023最新教程】从0到1开发自动化测试框架(0基础也能看懂)
一、序言 随着项目版本的快速迭代、APP测试有以下几个特点: 首先,功能点多且细,测试工作量大,容易遗漏;其次,代码模块常改动,回归测试很频繁,测试重复低效;最后&#x…...
linux备份命令小记 —— 筑梦之路
Linux dump命令用于备份文件系统。 dump为备份工具程序,可将目录或整个文件系统备份至指定的设备,或备份成一个大文件。 dump命令只可以备份ext2/3/4格式的文件系统, centos7默认未安装dump命令,可以使用yum install -y dump安…...
vue项目(vue-cli)配置环境变量和打包时区分开发、测试、生产环境
1.打包时区分不同环境在自定义配置Vue-cli 的过程中,想分别通过.env.development .env.test .env.production 来代表开发、测试、生产环境。NODE_ENVdevelopment NODE_ENVtest NODE_ENVproduction本来想使用上面三种配置来区分三个环境,但是发现使用test…...
Python 命名规范
Python 命名规范 基本规范 类型公有内部备注Packagepackage_namenone全小写下划线式驼峰Modulemodule_name_module_name全小写下划线式驼峰ClassClassName_ClassName首字母大写式驼峰Methodmethod_nameprotected: _method_name private: __method_name全小写下划线式驼峰Exce…...
操作系统——2.操作系统的特征
这篇文章,我们来讲一讲操作系统的特征 目录 1.概述 2.并发 2.1并发概念 2.1.1操作系统的并发性 3.共享 3.1共享的概念 3.2共享的方式 4.并发和共享的关系 5.虚拟 5.1虚拟的概念 5.2虚拟小结 6.异步 6.1异步概念 7.小结 1.概述 上一篇文章,我们…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
