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.概述 上一篇文章,我们…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...