d17(154-168)-勇敢开始Java,咖啡拯救人生

目录

方法递归

字符集

编码-解码

IO流

字节流

字节输入流 InputSream

FileInputStream

字节输出流 OutputSream

FileOutputSream

释放资源的方式

try-catch-finallly

try-with-resource

字符流

字符输入流 Reader

FileReader

文件字符输出流 Writer

FileWriter

缓冲流

字节缓冲流 BufferedInputStream BufferedOutputStream

字符缓冲流 BufferedReader BufferedWriter

转换流

字符输入转换流 InputStreamReader

字符输出转换流 OutputStreamWriter

打印流

PrintStream

PrintWriter

数据流

数据输出流 DataOutputStream

数据输入流 DataInputStream

序列化流

对象字节输出流 ObjectOutputStream

对象字节输入流 ObjectInputStream

注意

IO框架

Commons-io


方法递归

方法调用自身

直接递归:方法直接调用自己

间接递归:方法调用其他方法,其他方法又回调方法自己

递归死循环 -> 栈内存溢出错误

递归公式 + 递归终结点 + 其方向要走向终结点

其他应用:文件搜索

    private static void searchFile(File dir, String fileName) throws Exception {if(dir == null || !dir.exists() || dir.length() == 0 ){System.out.println("没找到");return;}File[] files = dir.listFiles();if(files != null && files.length > 0){for (File file : files) {if (file.isFile()){if (file.getName().contains(fileName)){System.out.println("路径为"+file.getAbsolutePath());// 启动软件Runtime runtime = Runtime.getRuntime();runtime.exec(file.getAbsolutePath());}}else {searchFile(file,fileName);}}}}
    private static void deleteDir(File dir) {if (dir == null || !dir.exists() || dir.length() == 0) {return;}// 是文件则删除if (dir.isFile()){dir.delete();return;}// 空文件夹则删除File[] files = dir.listFiles();if (files == null){return;}// 遍历当前文件夹下的所有。是文件则删除,是文件夹再进入for (File file : files) {if (file.isFile()){file.delete();}else {deleteDir(file);}}dir.delete();}
字符集

ASCII 0xxxxxxx 英文数字符号

GBK 1xxxxxxx xxxxxxxx 汉字2 英文数字1

unicode - UTF-8 可变长编码方案 1-4个字节

英文、数字等只占1个字节(兼容ASCII),汉字占3个字节

编码-解码

IO流

I(Input) 输入流:把数据读到内存中

O(Output) 输出流:负责写数据出去

按流中数据的最小单位 可分为:

字节流 适合操作所有类型文件

字符流 只适合操作纯文本

字节流
字节输入流 InputSream
FileInputStream

每次读取一个字节 read()

InputStream is = new FileInputStream(("文件路径"));int b;
while((b = is.read()) != -1){System.out.print((char)b);is.close();
}

每次读一个字节,读取性能较差,读取中文输出为乱码

每次读取多个字节 read(byte[] buffer)

byte[] buffer = new byte[3];
int len;
while((len = is.read(buffer)) != -1){// 读多少,倒多少String rs = new String(buffer, 0, len);System.out.print(rs);
}
is.close;

读取汉字时有可能出现乱码,因为汉字三个字节可能分开读入了

解决方案:把文件内的所有字节一次性读取

但是还是存在问题

如果文件过大,创建的字节数组也会过大,可能引起内存溢出

因此字符流更适合读写文本,字节流更适合做数据的转移,比如文件复制

字节输出流 OutputSream
FileOutputSream

注意覆盖追加

换行

os.write("\r\n".getBytes());

拷贝文件

复制文本、图片、视频等,任何文件都可以

释放资源的方式
try-catch-finallly

只有虚拟机终止 System.exit(0);时不会执行finally中的内容

不要在finally中return数据

一般用于在程序执行完成之后释放资源

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)os.close();}catch(Exception e){e.printStackTrace();}}
try-with-resource

字符流
字符输入流 Reader
FileReader

try(Reader fr = new FileReader("文件路径");
){// 每次读取单个字符int c;while((c = fr.read()) != -1){System.out.print((char)c);}// 每次读取多个字符char[] buffer = new char[3];int len;while((len = fr.read(buffer)) != -1){System.out. print(new String(buffer, 0, len));}
}catch(Exception e){e.printStackTrace();
}
文件字符输出流 Writer
FileWriter

注意写文件时,是覆盖还是追加

注意:字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效

字符流适合做文本文件的操作(读、写

缓冲流

对原始流进行包装,以提高原始流读写数据的性能

字节缓冲流 BufferedInputStream BufferedOutputStream

原理:字节缓冲输入流自带了8KB缓冲池,字节缓冲输出流也自带了8KB缓冲池

可以修改缓冲池大小

字符缓冲流 BufferedReader BufferedWriter

自带8KB的字符缓冲池,提高字符输入流读取字符数据的性能,提高字符输出流写字符数据的性能

字符缓冲输入流

字符缓冲输出流

低级流不一定比包装流差,缓冲池也不是越大越好

转换流

如果代码编码和被读取的文本编码一致,使用字符流读取文本文件时不会出现乱码,不一致时则会出现乱码

字符输入转换流 InputStreamReader

解决不同编码时,字符流读取文本内容乱码的问题。

先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了

字符输出转换流 OutputStreamWriter

控制写出去的字符使用指定字符集编码

1.可以调用String的getBytes

        String data = "一串字符";

        byte[] bytes = data.getBytes("GBK");

2.也可以使用字符输出转换流

        获取字符输出流,再按照指定的字符集编码将其转换成字符输出流,以后写出去的字符就会用该字符集编码了

打印流

方便高效的打印数据出去

PrintStream

打印什么、存储什么

PrintWriter

PrintStream和PrintWriter都方便高效,PrintStream继承自字节输出流OutputStream,支持写字节数据的方法,PrintWriter继承自字符输出流Writer,支持写字符数据出去

打印流还可以重定向输出语句:

PrintStream ps = new PrintStream("文件路径");

System.setOut(ps);

System.out.println("要打印的内容");

这样输出语句不会打印在控制台,而是在指定的文件内

数据流

数据输出流 DataOutputStream

允许把数据其类型一并写出去

数据输入流 DataInputStream

用于读取数据输出流写出去的数据

序列化流

对象序列化:把Java对象写入到文件中去

对象反序列化:把文件里的Java对象读出来

对象字节输出流 ObjectOutputStream

把Java对象进行序列化

对象要序列化,必须要实现序列化接口 Serializable

对象字节输入流 ObjectInputStream

把Java对象进行反序列化

注意

1.在序列化时,如果想将对象中某变量不序列化

可以在类中,在变量前加上transient修饰符,此时该成员变量不参与序列化

2.如果要一次性序列化多个对象,可以用ArrayList集合存储多个对象,然后直接对集合进行序列化[因为ArrayList集合已实现序列化接口 Serializable]

IO框架

框架:解决某类问题编写的一套类、接口等

在框架的基础上开发,可以得到优秀的软件架构,提高开发效率

jar包

IO框架:封装了Java的对文件、数据进行操作的代码,提供更简单的方式操作文件、读写数据

Commons-io

把要用的框架下载好,拷贝要用的jar包,在项目中新建文件夹lib,把jar包粘贴在该文件夹中,右键文件夹Add as Library

Files类也有很多功能啊,好卷,请为我提供呆瓜式编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/11629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达梦数据库 报错 数据类型不匹配

达梦数据库 报错 数据类型不匹配 背景描述问题分析问题处理方案1:方案2:TO_CHAR(str)CAST(value AS type)CONVERT(type,value)DBMS_LOB 包TEXT_EQUAL(n1,n2) 写在最后 背景描述 本文写于初接触到达梦(DM)数据库,之前没有用过,因此…

电脑快速搜索文件及文件夹软件——Everything

一、前言 Everything是一款由voidtools开发的文件搜索工具,主要运行于Windows操作系统上。它的主要功能是快速、高效地搜索电脑上的文件和文件夹名称。Everything通过利用NTFS文件系统的MFT(主文件表)来索引文件,从而实现几乎实时…

基于SpringBoot + MySQL的宠物医院管理系统设计与实现+毕业论文+指导搭建视频

系统介绍 项目的使用者可以避免排队挂号,比较方便,也方便于宠物医院的管理。现在的宠物本系统根据华阳社区宠物医院管理工作流程将系统使用者划分为三类,分别为、宠物医生、宠物主人以及系统管理人员,以下是对该三类类用户的具体…

Jmeter内存溢出原因及解决办法

现在越来越多的小伙伴在压力测试过程中选择使用Jmeter,原因是这个工具开源且小巧,而且还支持二次开发。 但是事情都有两面性,利弊共存啊,对比商业软件Loadrunner,Jmeter在高并发,特别是大型项目的高并发&a…

浏览器执行渲染原理

一、事件循环 事件循环(Event Loop)是JavaScript的执行环境的核心概念之一,它负责处理JavaScript中的异步操作和执行顺序。事件循环使得JavaScript能够在单线程上有效地处理并发,同时保持编程模型的简单性。 以下是事件循环的一…

使用Eigen将经纬度、高程、偏北角转成变换矩阵

目录 1、前言 2、示例 3、代码解析 4、垂直于给定点的切平面变换 5、代码解析 1、前言 在地球表面进行刚体变换时候,要将具有经纬度、高程和偏北角的坐标信息转换为变换矩阵表达,首先需要了解坐标系之间的转换关系。 通常,我们会将经纬…

AI2024(64bit) Adobe Illustrator 软件安装包下载

AI2024(64bit) Adobe Illustrator 软件安装包下载地址: 百度网盘下载https://pan.baidu.com/s/1C10-2JVN1rxFF5VFRuV2Yw?pwdSIMS 在创意设计的浩瀚宇宙中,Adobe Illustrator 2024如同一颗璀璨新星,以其无与伦比的创新功能和优化体验&#x…

快团团新人怎么找供货团长?免费教程一学就会!

作为快团团的新手,想要寻找供货团长,可以按照以下步骤进行: 打开微信:首先,在您的手机上打开微信应用。 搜索快团团:在微信顶部的搜索框中输入“团长运营之家”,选择出现的“团长运营之家”公号…

搭建网站式个人网盘-超仿Windows界面

搭建网站式个人网盘-超仿Windows界面 效果图部分源码领取源码下期更新预报 效果图 一款网站式个人网盘源码-Windows界面相等于一个网站式电脑可以放照片,视频-支持在线播放(你懂的)我觉得式一款很不错的个人网盘提醒:千万不要升级…

【STM32HAL库】DAC输出0-3.3v

一、简要介绍一下DAC DAC也有分辨率,转换时间,精度等 分辨率常见为8或12位的 转换时间F1,F4,F7都是3us左右,而H7系列是1.7us 1.DAC框图 2.数据格式(对齐方式) 3.触发源 4.可以发送DMA请求 注意&#xff…

【知识碎片】2024_05_13

本文记录了两道代码题【自除数】和【除自身以外数组的乘积】(利用了前缀积和后缀积,值得再看),第二部分记录了关于指针数组和逗号表达式的两道选择题。 每日代码 自除数 . - 力扣(LeetCode) /*** Note: T…

类与对象(二)

封装 封装作为面向对象三大特性(封装,继承,多态)之一,那如何实现封装性的呢?就又得拿出上面的访问修饰限定符的图 public: 就是在任何地方都可以访问 protected: 涉及子类在介绍继承时详细介绍 default: …

分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测

分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测 目录 分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现DBO-CNN-SVM蜣螂算法…

APP反抓包 - 客户端证书验证进阶(代码混淆)

1.关于混淆 在安卓开发中,对于第三方的包是可以进行混淆的,例如:OKHttp3.Http.Cert.check 被混淆后可以是a.f.c.b 形式。在安卓开发中,系统包是无法混淆的,例如:java.security.KeyStore不会被混淆。由于这种的情况的存在,再次审示我们之前的通用脚本,就会发现他是不通用…

计算机Java项目|Springboot房产销售系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简…

mybatis-plus(2)

上文我们介绍完mybatis-plus的常用注解,现在介绍 mp的基础的yaml配置 mybatis-plus:type-aliases-package: #该位置写 数据库对应实体类的全路径global-config:db-config:id-type: auto # 全局id类型为自增长 mp同时也是支持手写sql,而且mapper的读取地…

如何用 OceanBase做业务开发——【DBA从入门到实践】第六期

当应用一款新的数据库时,除了基础的安装部署步骤,掌握其应用开发方法才是实现数据库价值的关键。为此,我们特别安排了5月15日(周三)的《DBA 从入门到实践》第六期课程——本次课程将带大家了解OceanBase数据库的开发流…

【爬虫】爬取股票历史K线数据写入数据库(三)

前几天有写过两篇: 【爬虫】爬取A股数据写入数据库(二) 【爬虫】爬取A股数据写入数据库(一) 现在继续完善,分析及爬取股票的历史K线数据通过ORM形式批量写入数据库。 2024/05,本文主要内容如下…

JavaScript数字(Number)个数学(Math)对象

目录 前言: Number(数字)对象 前言: nfinity(正负无穷大): NaN(非数字): Number的属性 Number的方法 构造函数 静态方法 实例方法 Math(数学)对象…

【数据结构】详解队列

现在我们来掌握一下队列!如果有对往期知识有不足地方,可翻阅之前文章哦! 个人主页:小八哥向前冲~-CSDN博客 所属专栏:数据结构【c语言版】_小八哥向前冲~的博客-CSDN博客 栈和队列的实现其实都是对你顺序表和链表的检验…