当前位置: 首页 > news >正文

[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接口&#xff1a;service层封装:Dao接口&#xff1a;Dao层Mapper:映射实体类&#xff1a; 源数据如下 controller接口&#xff1a; RequestMapping("/UserTreeInfo")public RespBody getUserTreeInfo(Long userId) {List<MenuTreeVo>…...

c++学习笔记汇总

[TOC] (C学习笔记汇总) 基础认识、基础语法 类、类与类之间的关系、可调用对象、std::function类模板、c11新标准、资源管理方案RAII、指针、智能指针、引用计数、C的多态 ios、istream、iostream、fstream、sstream 模板编程&#xff1a; 模板编程&#xff1a;主要分为“泛…...

[动手学深度学习]生成对抗网络GAN学习笔记

论文原文&#xff1a;Generative Adversarial Nets (neurips.cc) 李沐GAN论文逐段精读&#xff1a;GAN论文逐段精读【论文精读】_哔哩哔哩_bilibili 论文代码&#xff1a;http://www.github.com/goodfeli/adversarial Ian, J. et al. (2014) Generative adversarial network…...

Kotlin中的算数运算符

在Kotlin中&#xff0c;我们可以使用各种算术运算符来进行数值计算和操作。下面对这些运算符进行详细描述&#xff0c;并提供示例代码。 正号&#xff08;正数&#xff09;和负号&#xff08;负数&#xff09;&#xff1a; 正号用于表示一个正数&#xff0c;不对数值进行任何…...

Linux高性能服务器编程 学习笔记 第十六章 服务器调制、调试和测试

Linux平台的一个优秀特性是内核微调&#xff0c;即我们可以通过修改文件的方式来调整内核参数。 服务器开发过程中&#xff0c;可能会碰到意想不到的错误&#xff0c;一种调试方法是用tcpdump抓包&#xff0c;但这种方法主要用于分析程序的输入和输出&#xff0c;对于服务器的…...

第三期:云函数入门指南答案

1.云函数需要用户自行考虑租用/购买多少资源以达到最少成本最高效运行自己的函数。 答案&#xff1a;错误(False) 2.Cloud Functions可以为您准备好计算资源&#xff0c;弹性地、可地运行任务&#xff0c;并提供日志查询、性能监控和报警等功能。 答案&#xff1a;正确(True…...

企业怎么通过数字化工具来实现数字化转型?

数字化转型是使用数字技术和工具从根本上改变公司运营方式并向客户提供价值的过程。它涉及思维方式、流程和技术的全面转变&#xff0c;以跟上快节奏的数字时代。以下是有关公司如何通过数字工具实现数字化转型的分步指南&#xff1a; 1.定义您的愿景和目标&#xff1a; 首先确…...

React函数式写法和类式写法的区别(以一个计数器功能为例子)

函数式写法更加简洁和函数式编程思维导向&#xff0c;适用于无状态、UI纯粹的组件&#xff0c;且可以使用Hooks处理副作用。而类式写法适用于有内部状态、生命周期方法和复杂交互逻辑的组件&#xff0c;提供了更多的灵活性和控制力。 文章目录 一、计数器功能演示 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、哪些数据适合加缓存 使用缓存时&#xff0c;一定是数据库中的数据极少发生改…...

Spark大数据分析与实战笔记(第一章 Scala语言基础-4)

文章目录 每日一句正能量1.4 Scala面向对象的特性1.4.1 类与对象的特性1.4.2 继承1.4.3 单例对象和伴生对象1.4.4 特质 每日一句正能量 若要快乐&#xff0c;就要随和&#xff1b;若要幸福&#xff0c;就要随缘。快乐是心的愉悦&#xff0c;幸福是心的满足。别和他人争吵&#…...

腾讯云服务器端口localhost可以访问,外部无法访问解决

搭建frp跳板&#xff0c;发现无法使用。ssh 连接不上。 主要检查2个东西&#xff1a; 1. ubuntu ufw系统防火墙。这个默认是关掉的 2. tencent这个防火墙规则设置后&#xff0c;还要设置到实例上。 以前不是这样的。就掉坑里了。 # 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 如下图所示&#xff0c;就为其版本 3.通过查看readme_eclipse.html文件...

论文精讲目录

ViT论文逐段精读【论文精读】MoCo 论文逐段精读【论文精读】对比学习论文综述【论文精读】Swin Transformer论文精读【论文精读】CLIP 论文逐段精读【论文精读】双流网络论文逐段精读【论文精读】I3D 论文精读【论文精读】视频理解论文串讲&#xff08;上&#xff09;【论文精读…...

双飞翼布局和圣杯布局

双飞翼布局和圣杯布局都是一种三栏布局&#xff0c;其中主要内容区域位于中间&#xff0c;左侧栏和右侧栏位于两侧。它们的实现方式类似&#xff0c;但有一些细微的差别。 双飞翼布局的实现原理是通过使用flex布局&#xff0c;给主要内容区域设置flex&#xff1a;1&#xff1b…...

Hive insert插入数据与with子查询

1. insert into 与 insert overwrite区别 insert into 与 insert overwrite 都可以向hive表中插入数据&#xff0c;但是insert into直接追加到表中数据的尾部&#xff0c;而insert overwrite会重写数据&#xff0c;既先进行删除&#xff0c;再写入 注意&#xff1a;如果存在分…...

如何在Django中集成JWT

文章目录 JWT简介在Django中使用JWT1. 安装2. 配置3. 添加认证接口 客户端使用JWT1. 获取新token2. 调用API3. 刷新token 同步发布在个人站点&#xff1a;https://panzhixiang.cn JWT简介 JWT(JSON Web Token)是一种流行的跨域认证解决方案。它可以在令牌中安全地传输用户身份…...

hive进行base64 加密解密函数

加密 select base64(cast(abcd as binary))YWJjZA 解密 -- 直接解密&#xff08;结果字段格式为比binary格式&#xff09; select unbase64(YWJjZA) -- 格式转换 select cast(unbase64(YWJjZA) as string) abcd...

Docker安装GitLab及使用图文教程

作者&#xff1a; 宋发元 GitLab安装及使用教程 官方教程 https://docs.gitlab.com/ee/install/docker.html Docker安装GitLab 宿主机创建容器持久化目录卷 mkdir -p /docker/gitlab/{config,data,logs}拉取GitLab镜像 docker pull gitlab/gitlab-ce:15.3.1-ce.0运行GitLa…...

asp.net酒店管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net酒店管理系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net 酒店管理系统1 二、功能介绍 …...

Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv 计算机竞赛

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; Yolov安全帽佩戴检测 危险区域进入检测 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;3分创新点&#xff1a;4分 该项目较为新颖&am…...

vue中动态设置source标签

项目中有个视频播放,路径通过接口返回,而且不带后缀,并不确定是什么类型的视频文件,所以要通过source标签去进行设置. 问题:当video中存在source标签的时候&#xff0c;浏览器渲染之后会自动去获取地址&#xff0c;即便地址改变&#xff0c;浏览器也不会再去获取地址。 解决方…...

【16】基础知识:React路由 - React Router 6

一、概述 了解 React Router 以三个不同的包发布到 npm 上&#xff0c;它们分别为 1、react-router&#xff1a;路由的核心库&#xff0c;提供了很多的组件、钩子。 2、react-router-dom&#xff1a;包含 react-router 所有内容&#xff0c;并添加一些专门用于 DOM 的组件&…...

Unity3D 基础——Coroutine 协同程序

Coroutine 称为协同程序或者协程&#xff0c;协同程序可以和主程序并行运行&#xff0c;和多线程有些类似。协同程序可以用来实现让一段程序等待一段时间后继续运行的效果。例如&#xff0c;执行步骤1&#xff0c;等待3秒&#xff1b;执行步骤2&#xff0c;等待某个条件为 true…...

IDEA报错:前言中不允许有内容

idea启动项目提示前言中不允许有内容 .idea\libraries\Maven__axis2_axis2_1_0.xml: ParseError at [row,col]:[1,1] Message: 前言中不允许有内容。 解决方法&#xff1a; 首先修改设置&#xff1a;IDEA–>File–>Settings–>File Encodings–>with No BOM选中报…...

在线课堂分销商城小程序源码系统 带完整搭建教程

大家好啊&#xff0c;今天来给大家分享一个在线课堂分销商城小程序源码系统&#xff0c;一起来看看吧。以下是部分功能实现的核心代码&#xff1a; 系统特色功能一览&#xff1a; 商品模块。包括实物商品、虚拟商品和电子卡密等&#xff0c;每种商品可以设置对应的商品分类。同…...

世界500强企业排名中国企业/seo外包一共多少钱

养玉麒麟&#xff0c;用点“养根土”&#xff0c;一棵小苗变“威武老桩”&#xff0c;就这么简单玉麒麟大家应该都不陌生吧&#xff0c;他是大戟科的植物&#xff0c;他的整个植株是由变态茎所组成的&#xff0c;形态各异&#xff0c;非常的漂亮&#xff0c;比较适合当作盆景养…...

怎样做网站备份/高手优化网站

.loading{background-color: #387ef5 !important;} 只需要在自定义css文件中设置即可转载于:https://www.cnblogs.com/fanhq/p/5261870.html...

机械网站开发/网络广告文案

在python中没有类似sub()或者subString()的方法&#xff0c;但是字符串的截取操作却是更加简单。 只需要把字符串看作是一个字符数组&#xff0c;截取子串非常方便。 多余的话就不啰嗦了&#xff0c;看下面的例子就明白了。 str ’0123456789′ print str[0:3] #截取第一位到第…...

营销型网站建设模板下载/游戏推广是什么工作

修改图片格式 matlab代码 其实内部一些代码是用了rbg的fast-rcnn代码的。 \datasets\VOCdevkit2007\VOCcode\VOCinit.m里面&#xff0c;查找jpg,改成png 以及&#xff0c;\imdb\imdb_from_voc.m里面&#xff0c;查找imdb.extension&#xff0c;修改它的值为png python代码 py-f…...

网站开发维护入哪个科目/台州做优化

Lua 数据类型 Lua 是动态类型语言&#xff0c;变量不要类型定义,只需要为变量赋值。 值可以存储在变量中&#xff0c;作为参数传递或结果返回。 Lua 中有 8 个基本类型分别为&#xff1a;nil、boolean、number、string、userdata、function、thread 和 table。 数据类型描述nil…...

做夺宝网站要办理什么/大冶seo网站优化排名推荐

第三章 数据库和表1[单选题]在MySQL中&#xff0c;通常使用________语句来指定一个已有数据库作为当前工作数据库。A.USINGB.USEDC.USESD.USE参考答案&#xff1a;D2[简答题]请使用MySQL命令行客户端在MySQL中创建一个名为db_test的数据库。参考解析&#xff1a;在MySQL命令行…...