Java IO流-字节流
简介
- IO流的输入与输出,都在站在内存的角度来看的,因为毕竟是和内促你打交道的嘛!


分类
IO流是可以根据
方向,或者最小单位进行划分的

上述两两结合一下,就得到四种大的分类

IO流的继承体系

字节输入流InputStream
- 创建字节输入流对象
- 读取字节

创建流对象
// 创建一个文件输入流 用于链接文件
// File 对象的路径可以存在也可以不存在
// 但是文件输入流的对象是必须要存在的,所以这里需要抛出一个异常
// InputStream is = new FileInputStream( new File("D:\\新建 XLSX 工作表.txt"));
InputStream is = new FileInputStream("D:\\新建 XLSX 工作表.txt");
使用循环一个个字节输入
- 效率低下
- 读到汉字必定乱码(一个个字节读取,但是汉字至少是三个字节)
// 读取字节
// 1. 读取一个字节 返回的是一个int类型的数据
// 2. 读取到文件的末尾 返回-1
int i ;
while ( (i=is.read()) != -1) {System.out.print((char) i);
}
关闭流
// 关闭流 释放资源
is.close();
读取多个字节
- 返回的事读取的字节数
- 最后一次读取肯定不能读满,一定要遵循一个原理:
读取到多少个字节就输出多少个字节- 效率得到提升,但是不可避免汉字乱码的问题
InputStream is = new FileInputStream("D:\\新建 XLSX 工作表.txt");// 读取字节 一般大小都是1024的整数倍byte[] buffer = new byte[1024 * 8];int len;try {// read(buffer) 方法返回的是读取到的字节数 读取到文件末尾返回-1while ((len = is.read(buffer)) != -1) {// 应该是读取到多少个字节就输出多少个字节 不然会造成数据错误System.out.println(new String(buffer, 0, len));}} catch (Exception e) {e.printStackTrace();} finally {try {is.close();} catch (Exception e) {e.printStackTrace();}}
- 上述情况证明了:字节流的读取,只适合非字符的,适合非文本类型的
- 文本类型的得使用字符流,不要使用字节流
读取全部字节
- 一次读取全部字节能够解决中文乱码的问题
- 但是文件过大,就会有潜在问题
File file = new File("D:\\新建 XLSX 工作表.txt");
InputStream is = new FileInputStream(file);
long length = file.length();// 一次性读取所有的字节(这样就避免了乱码的问题)
// byte[] 数组接受的长度是int类型的 但是文件的大小很有可能超过int的范围
byte[] buffer = new byte[(int) length ];
int read = is.read(buffer);// 读取到的字节数 一般情况下是等于文件的大小
System.out.println(new String(buffer, 0, read));// 关闭流 释放资源
is.close();
Java提供了现成的方法
此方法是jdk17之后才有的,jdk8的项目不要这么写
InputStream is = new FileInputStream("D:\\新建 XLSX 工作表.txt");
byte[] buffer = is.readAllBytes();
System.out.println(new String(buffer));
文件字节输出流FileOutPutStream
创建API
- 若非是提前获取到File类型的对象,应该
使用第2个和第4个方法- 尽量使用第4个方法,告知使用追加数据

// 创建一个文件输出流
// 这个地方虽然会抛出文件找不到异常,但是如果文件不存在,会自动创建一个新文件
// 这里的true表示追加写入,如果不加true,会覆盖原文件
// 这里的是否追加是针对流的,而不是文件的(文件不存在可不可以追加这一说)
OutputStream os = new FileOutputStream("test.txt",true);
输出API

// 写入数据 一个个字节写入的
// 可以写入ASCII,也可以写入字符
// 非ASCII的字符会导致乱码
os.write(97);
os.write('b');
// 写入字节数组 一次写入多个字节 可以规定起始位置和长度
byte[] bytes = "hello我爱你中国".getBytes();
os.write(bytes);
os.write(bytes, 0, 8);
特殊符号
换行符:
- \n :windows
- \r\n:所有平台的换行符
// 可以提前将换行符声明为一个字节数组,然后写入
byte[] huanHang = "\r\n".getBytes();
os.write(huanHang);
os.write(99);
案例-文件复制

- 定义
输入流-链接原文件- 定义
输出流-链接新文件- 循环读取数据
- 将循环读取的数据写入到新文件中
// 创建一个文件输出流 写入文件// 复制文件的时候不要定义append为true,否则会追加写入OutputStream os = new FileOutputStream("test2.txt");// 定义一个字节数组,用来存放读取到的数据byte[] bytes = new byte[1024 * 8];// 循环读取数据try {int len = 0;// 读取数据到字节数组中,返回读取到的字节数while ((len = is.read(bytes)) != -1) {// 循环写入数据 从0开始,写入len个字节os.write(bytes, 0, len);}} catch (Exception e) {e.printStackTrace();}finally {// 关闭流try {is.close();os.close();} catch (IOException e) {e.printStackTrace();}}
- 前面不是说文件字节流只适合非文本的文件吗,为什么文件复制的时候不会出问题呢?
- 因为每次复制的都是全部的内容,不管是ASCII的,还是非ASCII的,最后都会
完完整整地复制过来
释放资源
try-catch-finally
- 常见的释放资源的方式是:在try中包裹对IO流的操作,在
finally中释放资源(输入流和输出流)- finally 非常强大,即使你已经
return了,他还会坚持把finally中代码执行一遍- 只有一种情况finally
执行不到,就是JVM停了,例如调用System.exit(0)

InputStream is = null;
OutputStream os = null;
// 循环读取数据
try {// 创建一个文件输入流 读取文件is = new FileInputStream("test.txt");// 创建一个文件输出流 写入文件// 复制文件的时候不要定义append为true,否则会追加写入os = new FileOutputStream("test2.txt");// 定义一个字节数组,用来存放读取到的数据byte[] bytes = new byte[1024 * 8];int len = 0;// 读取数据到字节数组中,返回读取到的字节数while ((len = is.read(bytes)) != -1) {// 循环写入数据 从0开始,写入len个字节os.write(bytes, 0, len);}
} catch (Exception e) {e.printStackTrace();
}finally {// 关闭流try {if (is != null)is.close();if (os != null)os.close();} catch (IOException e) {e.printStackTrace();}
}
try-with-resourses
- 上面的写法很专业,但是很复杂,很臃肿
- try-with-resourses 免去了
手动书写finally的过程try的括号里面之定义需要关闭的资源对象,不要定义其他的东西- 这里的资源基本指的是java官方定义的资源,数据流啊,数据库链接啊,不包括一些小众的资源。
官方资源之所以能够自动关闭,是因为实现了接口 AutoClosable- 如果自定义的资源也想使用上述语法,就必须是先实现接口AutoClosable

try (// 将资源放在try的括号中,try中的代码执行完毕之后,会自动关闭资源InputStream is = new FileInputStream("test.txt");OutputStream os = new FileOutputStream("test2.txt");
) {// 定义一个字节数组,用来存放读取到的数据byte[] bytes = new byte[1024 * 8];int len = 0;// 读取数据到字节数组中,返回读取到的字节数while ((len = is.read(bytes)) != -1) {// 循环写入数据 从0开始,写入len个字节os.write(bytes, 0, len);}
} catch (Exception e) {e.printStackTrace();
}
注意事项

相关文章:
Java IO流-字节流
简介 IO流的输入与输出,都在站在内存的角度来看的,因为毕竟是和内促你打交道的嘛! 分类 IO流是可以根据方向,或者最小单位进行划分的 上述两两结合一下,就得到四种大的分类 IO流的继承体系 字节输入流InputStream 创建…...
第十五届蓝桥杯复盘python大学A组——试题B 召唤数学精灵
按照正常思路解决,由于累乘消耗大量时间,因此这不是一个明智的解决方案。 这段代码执行速度非常慢的原因在于它试图计算非常大的数的阶乘(累乘),并且对于每一个i的值都执行这个计算。阶乘的增长是极其迅速的ÿ…...
网络通信——常见结构及强联网游戏和弱联网游戏区别
声明:本文为个人笔记,用于学习研究使用非商用,内容为个人研究及综合整理所得,若有违规,请联系,违规必改。 网络通信——常见结构及强联网游戏和弱联网游戏区别 文章目录 网络通信——常见结构及强联网游戏和…...
如何安装PyFluent
0.什么是PyFluent? 官方介绍如下: PyFluent 是 PyAnsys 生态系统的一部分, 允许您在所选的 Python 环境中结合使用 Fluent 与其他 PyAnsys 库和外部 Python 库一起使用。 PyFluent 实现了客户端-服务器体系结构。它使用谷歌遥控器 过程调用或 gRPC 接…...
Qt 2 QMapQHashQVector类实例
1. QMap // 1:QMap的使用// 创建一个QMap 实例 key 为 QString value 为 intQMap<QString,int> Grade;// 插入方式有两种插入方式// 1.map[key] valueGrade["语文"] 90;Grade["数学"] 120;// 2.map.insert(key,value);Grade.insert("英语&qu…...
使用Git将文件夹上传到Github以及使用Git LFS上传大文件
使用Git将文件夹上传到Github以及使用Git LFS上传大文件...
1.SCI各模块
1.学会“抄” 写论文,一定要学会“抄”!这样才能事半功倍,尤其是对于初次写作的新手,否则写作过程一定会让你痛不欲生,而且写出来的东西就是一坨shi,不仅折磨自己,也折磨导师。 写论文与建大楼…...
记录shell编程中$1,$@等符号的含义
笔者最近老是遇到shell中的$相关的题目,于是打算写篇文章记录一下。考虑到并没有特别多需要解释的内容,所以并不会进行介绍,上图上表上代码,让机器说话,machine always right test.sh #/bin/bash echo $# $# echo …...
单链表的应用
文章目录 目录1. 单链表经典算法OJ题目1.1 [移除链表元素](https://leetcode.cn/problems/remove-linked-list-elements/description/)1.2 [链表的中间节点](https://leetcode.cn/problems/middle-of-the-linked-list/description/)1.3 [反转链表](https://leetcode.cn/problem…...
手机副业赚钱秘籍:让你的手机变成赚钱利器
当今社会,智能手机已然成为我们生活不可或缺的一部分。随着技术的飞速进步,手机不再仅仅是通讯工具,而是化身为生活伴侣与工作助手。在这个信息爆炸的时代,我们时常会被一种焦虑感所困扰:如何能让手机超越消磨时光的定…...
(二十七)Flask之数据库连接池DBUtils库
目录: 每篇前言:DBUtils库模式一(底层使用threading.local实现):模式二:Flask中使用方式一:直接将DBUtils初始化放到settings.py文件中方式二:从utils文件夹中导入脚本使用DBUtils代码demo:每篇前言: 🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心…...
FewShotPromptTemplate和SemanticSimilarityExampleSelector的学习
FewShotPromptTemplate 和 SemanticSimilarityExampleSelector 是在少样本学习(FewShot Learning)场景中常用的两种技术,它们在提高模型泛化能力和减少对大量标注数据的依赖方面扮演着重要角色。 下面我会解释它们之间的关系: F…...
【保姆级】2024年OnlyFans订阅指南
OnlyFans是一个独特的社交媒体平台,它为创作者和粉丝提供了一个互动交流的空间。通过这个平台,创作者可以分享他们的独家内容,而粉丝则可以通过订阅来支持和享受这些内容。如果你对OnlyFans感兴趣,并希望成为其中的一员࿰…...
深入理解JVM中的G1垃圾收集器原理、过程和参数配置
码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 在Java虚拟机(JVM)中,垃圾收集(GC)是一个自动管理内存的过程ÿ…...
VUE3 + Elementui-Plus 之 树形组件el-tree 一键展开(收起);一键全选(不全选)
需求: 产品要求权限树形结构添加外部复选框进行全部展开或收起;全选或不全选。 实现步骤: tree组件部分: <div class"role-handle"><div>权限选择(可多选)</div><div><el-checkbox v-mode…...
【Godot4自学手册】第三十七节钥匙控制开门
有些日子没有更新了,实在是琐事缠身啊,今天继续开始自学Godot4,继续完善地宫相关功能,在地宫中安装第二道门,只有主人公拿到钥匙才能开启这扇门,所以我们在合适位置放置一个宝箱,主人公开启宝箱…...
GitHub repository - Pulse - Contributors - Network
GitHub repository - Pulse - Contributors - Network 1. Pulse2. Contributors3. NetworkReferences 1. Pulse 显示该仓库最近的活动信息。该仓库中的软件是无人问津,还是在火热地开发之中,从这里可以一目了然。 2. Contributors 显示对该仓库进行过…...
RocketMQ 10 面试题FAQ
RocketMQ 面试FAQ 说说你们公司线上生产环境用的是什么消息中间件? 为什么要使用MQ? 因为项目比较大,做了分布式系统,所有远程服务调用请求都是同步执行经常出问题,所以引入了mq 解耦 系统耦合度降低,没有强依赖…...
【Spring进阶系列丨第十篇】基于注解的面向切面编程(AOP)详解
文章目录 一、基于注解的AOP1、配置Spring环境2、在beans.xml文件中定义AOP约束3、定义记录日志的类【切面】4、定义Bean5、在主配置文件中配置扫描的包6、在主配置文件中去开启AOP的注解支持7、测试8、优化改进9、总结 一、基于注解的AOP 1、配置Spring环境 <dependencie…...
Leetcode 152. 乘积最大子数组和Leetcode 162. 寻找峰值
文章目录 Leetcode 152. 乘积最大子数组题目描述C语言题解和思路解题思路 Leetcode 162. 寻找峰值题目描述C语言题解和思路解题思路 Leetcode 152. 乘积最大子数组 题目描述 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
