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.概述 上一篇文章,我们…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
