[java进阶]——IO流,递归实现多级文件拷贝
🌈键盘敲烂,年薪30万🌈
目录
一、认识IO流
二、了解编码与解码
二、IO流体系
三、字节输入输出流
四、字符输入输出流
五、多级文件拷贝
一、认识IO流
IO流也叫输入流(intput)、输出流(onput),该流就像java程序同硬盘之间的一条数据传输通道,我们说的输入流、输出流是向java程序输入数据、从java程序输出数据
二、了解编码与解码
我们知道存储在文件里面的都是二进制0 1,数据在往文件里存储前会先转为二进制,转化为了二进制再经过编码存储到文件里面。
假如我要存字符a,是如何编码的,a对应的ASCII码值为97,二进制为110 0001,补全8位比特位变为0110 0001,这就是a要存储的二进制,这也是英文字符的编码方案,那要是存储一个汉字呢,汉字也有对应的二进制的值,只不过这个表不是ASCII码表,而是GBK或者Unicode表,里面大约存储了2万多个汉字,2万多个汉字,我们用2个字节保存它的二进制戳戳有余,不同的标准有不同的编码方案,例如UTF-8编码方案一个汉字占3个字节,ANSI编码方案一个汉字占2个字节,我们要了解UTF-8编码方案。
UTF-8英文字符编码过程

UTF-8汉字编码过程


解析:
问题一有四个英文字符
问题二两个英文字符2个汉字字符
总结:
Unicode字符集利用UTF-8的编码方案
英文字符占一个字节且二进制第一位是0
中文字符占3个字节且每个字节二进制第一位是1
那你能不能解释一下为什么乱码呢???
原因一:编码与解码规则不一样
原因二:未读取完整个汉字字符
二、IO流体系

三、字节输入输出流
3.1输入流
适用范围: 可读取任何文件,一次性读取一个字节
如何使用: 1.获取文件字节流对象 2.read()方法 3.关闭流
代码解析:
构造方法里面可以是字符串,也可以是文件对象
read()方法有两个功能,读取一个字节并返回它ascii码值的十进制,移动指针
当读到文件末尾返回-1
最后close关闭流,不关闭该文件会被一直占用
FileInputStream fis = new FileInputStream("10_16\\a.txt");
int tmp = 0;
while((tmp = fis.read()) != -1){System.out.print((char)tmp);
}
fis.close();
这样一个一个字节读取是不是太慢了啊,我们可以一次读取一个字节数组,这不就O了嘛
代码解析:
bytes用于保存每一次读取的数据,
read也是读取字节,移动指针,并且返回读取字节的个数。
注意:
每一次读取新数据会将原数据覆盖,所以如果最后一次没读够10字节,数组后面的内容是上一次读取的。
read()括号里面要穿入数组
bytes数组里的数据是字符,不是它ASCII码的十进制了
FileInputStream fis = new FileInputStream("10_16\\a.txt");//路径要两个\\
byte[] bytes = new byte[10]; //一次性读取10个字节
int len= 0;
while((len= fis.read(bytes)) != -1){String s = new String(bytes, 0, len);System.out.print(s);
}
fis.close();
3.2输出流
代码解析:
构造函数的第二个参数表示你要不要续写该文件,如果是false,会清空源文件内容
不写默认为false
\r,\n代表回车换行符,如果只写一个,编译器会帮我们补全
write写入,最后别忘了关闭流
FileOutputStream fos = new FileOutputStream("10_16\\a.txt",false);fos.write(97); //写入字符afos.write('a');fos.write('\r'); //写入回车换行符byte[] bytes = {97, 98, 99};fos.write(bytes);//写入字符a b cfos.close();
四、字符输入输出流
4.1输入流
只适用于读取纯文本文件(用记事本打开不会乱码),一次性读取一个字节或者一个字符
一个汉字如果采用UTF-8的编码方案,占3个字节,所以一次想读取一个有效字符,用文件字符流
代码分析:
跟上面一样,只不过要注意,读多个字符的时候,数组要用char类型
//一次读取一个有效字符FileReader fr = new FileReader("10_16\\a.txt");int tmp = 0;while ((tmp = fr.read()) != -1){System.out.print((char)tmp);}fr.close();//一次读取多个有效字符FileReader fr = new FileReader("10_16\\a.txt");int len = 0;char[] chars = new char[10];while ((len = fr.read(chars)) != -1){System.out.print(new String(chars, 0, len));}fr.close();
4.2输出流
可传入类型

FileWriter fw = new FileWriter("10_16\\a.txt");
fw.write("hello world");
fw.close();
4.3字符流自带的加载缓冲区功能
利用字符流操作数据时,会在内存中开辟8192字节的缓冲区,每次读取或者写入数据都是先找缓冲区。
五、多级文件拷贝
核心思路:
创建两个文件路径src与dest,一个为要拷贝的文件,一个为拷贝的目的地
先创建改路径下的dest文件夹
遍历src文件,如果不是文件,继续递归,如果是文件,拷贝
private static void copyFile1(File src, File dest) throws IOException {//先创建文件夹dest.mkdir();//进入路径 遍历文件for (File file : src.listFiles()) {if(file.isDirectory()){//递归//这里的dest路径要好好想一下copyFile1(file, new File(src, file.getName()));}else{//拷贝文件FileInputStream fis = new FileInputStream(src);FileOutputStream fos = new FileOutputStream(dest);int tmp = 0;while ((tmp = fis.read()) != -1){fos.write(tmp);}//关闭流fos.close();fis.close();}}
六、总结
操作纯文本文件可以用字符和字节流,不是纯文本文件用字节流
字节输入流以字节为单位向java程序传输数据,可以是1个字节,可以是1个字节数组,字符输入流以字符为单位也可以是一个字符或一个字符数组,输出流与之类似
字符流有缓冲区的概念
相关文章:
[java进阶]——IO流,递归实现多级文件拷贝
🌈键盘敲烂,年薪30万🌈 目录 一、认识IO流 二、了解编码与解码 二、IO流体系 三、字节输入输出流 四、字符输入输出流 五、多级文件拷贝 一、认识IO流 IO流也叫输入流(intput)、输出流(onput),该流就像java程序同硬盘之间的…...
Linux创建与删除用户
Linux创建与删除用户 新增用户: adduser 用户名【添加用户】 passwd 用户名【设置用户密码】删除用户: userdel -r 用户名【删除用户】...
对传感器采样数据的低通滤波
低通滤波(Low-pass filter) 是一种过滤方式,规则为低频信号能正常通过,而超过设定临界值的高频信号则被阻隔、减弱。 一阶低通数字滤波器 滤波系数a越小,滤波结果越平稳,但是灵敏度低;滤波系数a越大,滤波结…...
Java开发树结构数据封装!
目录 源数据如下controller接口:service层封装:Dao接口:Dao层Mapper:映射实体类: 源数据如下 controller接口: RequestMapping("/UserTreeInfo")public RespBody getUserTreeInfo(Long userId) {List<MenuTreeVo>…...
c++学习笔记汇总
[TOC] (C学习笔记汇总) 基础认识、基础语法 类、类与类之间的关系、可调用对象、std::function类模板、c11新标准、资源管理方案RAII、指针、智能指针、引用计数、C的多态 ios、istream、iostream、fstream、sstream 模板编程: 模板编程:主要分为“泛…...
[动手学深度学习]生成对抗网络GAN学习笔记
论文原文:Generative Adversarial Nets (neurips.cc) 李沐GAN论文逐段精读:GAN论文逐段精读【论文精读】_哔哩哔哩_bilibili 论文代码:http://www.github.com/goodfeli/adversarial Ian, J. et al. (2014) Generative adversarial network…...
Kotlin中的算数运算符
在Kotlin中,我们可以使用各种算术运算符来进行数值计算和操作。下面对这些运算符进行详细描述,并提供示例代码。 正号(正数)和负号(负数): 正号用于表示一个正数,不对数值进行任何…...
Linux高性能服务器编程 学习笔记 第十六章 服务器调制、调试和测试
Linux平台的一个优秀特性是内核微调,即我们可以通过修改文件的方式来调整内核参数。 服务器开发过程中,可能会碰到意想不到的错误,一种调试方法是用tcpdump抓包,但这种方法主要用于分析程序的输入和输出,对于服务器的…...
第三期:云函数入门指南答案
1.云函数需要用户自行考虑租用/购买多少资源以达到最少成本最高效运行自己的函数。 答案:错误(False) 2.Cloud Functions可以为您准备好计算资源,弹性地、可地运行任务,并提供日志查询、性能监控和报警等功能。 答案:正确(True…...
企业怎么通过数字化工具来实现数字化转型?
数字化转型是使用数字技术和工具从根本上改变公司运营方式并向客户提供价值的过程。它涉及思维方式、流程和技术的全面转变,以跟上快节奏的数字时代。以下是有关公司如何通过数字工具实现数字化转型的分步指南: 1.定义您的愿景和目标: 首先确…...
React函数式写法和类式写法的区别(以一个计数器功能为例子)
函数式写法更加简洁和函数式编程思维导向,适用于无状态、UI纯粹的组件,且可以使用Hooks处理副作用。而类式写法适用于有内部状态、生命周期方法和复杂交互逻辑的组件,提供了更多的灵活性和控制力。 文章目录 一、计数器功能演示 1.函数式写法…...
【根据国防科大学报官网word模板修改的Latex模板】
根据国防科大学报官网word模板修改的Latex模板 学报Word模板链接Latex模板结构编译环境为Texlivevscode或Textstudio 学报Word模板链接 学报官网相关下载链接 点击链接即可前往官网下载相关word模板 Latex模板结构 latex模板 ass.cfg文件 %深层模板文件ass.cls文件 %浅层模板…...
系列十一、Redis中分布式缓存实现
一、缓存 1.1、什么是缓存 内存就是计算机内存中的一段数据。 1.2、内存中的数据特点 读写快断电数据丢失 1.3、缓存解决了什么问题 提高了网站的吞吐量和运行效率减轻了数据库的访问压力 1.4、哪些数据适合加缓存 使用缓存时,一定是数据库中的数据极少发生改…...
Spark大数据分析与实战笔记(第一章 Scala语言基础-4)
文章目录 每日一句正能量1.4 Scala面向对象的特性1.4.1 类与对象的特性1.4.2 继承1.4.3 单例对象和伴生对象1.4.4 特质 每日一句正能量 若要快乐,就要随和;若要幸福,就要随缘。快乐是心的愉悦,幸福是心的满足。别和他人争吵&#…...
腾讯云服务器端口localhost可以访问,外部无法访问解决
搭建frp跳板,发现无法使用。ssh 连接不上。 主要检查2个东西: 1. ubuntu ufw系统防火墙。这个默认是关掉的 2. tencent这个防火墙规则设置后,还要设置到实例上。 以前不是这样的。就掉坑里了。 # systemctl rootVM-4-4-ubuntu:/lib/syst…...
【软考-中级】系统集成项目管理工程师 【16 变更管理】
持续更新。。。。。。。。。。。。。。。 【第十六章】变更管理 (选择2分 考点 1:变更的常见原因考点 2:变更管理的原则是项目基准化、变更管理过程规范化考点 3考点 4考点 5:变更的工作程序考点 6考点 7考点 8考点 9考点 10考点 11考点 12:变更分类系列文章经典语录 考点 1:变…...
【Eclipse】查看版本号
1.在Eclipse的启动页面会出现版本号 2. Eclipse的关于里面 Help - About Eclipse IDE 如下图所示,就为其版本 3.通过查看readme_eclipse.html文件...
论文精讲目录
ViT论文逐段精读【论文精读】MoCo 论文逐段精读【论文精读】对比学习论文综述【论文精读】Swin Transformer论文精读【论文精读】CLIP 论文逐段精读【论文精读】双流网络论文逐段精读【论文精读】I3D 论文精读【论文精读】视频理解论文串讲(上)【论文精读…...
双飞翼布局和圣杯布局
双飞翼布局和圣杯布局都是一种三栏布局,其中主要内容区域位于中间,左侧栏和右侧栏位于两侧。它们的实现方式类似,但有一些细微的差别。 双飞翼布局的实现原理是通过使用flex布局,给主要内容区域设置flex:1;…...
Hive insert插入数据与with子查询
1. insert into 与 insert overwrite区别 insert into 与 insert overwrite 都可以向hive表中插入数据,但是insert into直接追加到表中数据的尾部,而insert overwrite会重写数据,既先进行删除,再写入 注意:如果存在分…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
