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.hqwc.cn/news/696633.html

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

相关文章

庙算兵棋推演AI开发初探(4-调用AI模型)

前面讲了如何开展编写规则脚本型Agent(智能体)的方法,现在探究一下如何调用知识型(一般而言的训练出的模型)智能体的方法。 这次调用的是庙算平台的demo(网址见图) 下载了“知识强化学习型”…

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

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

红外遥控和LCD1602

26.1.1 红外线简介 人的眼睛能看到的可见光按波长从长到短排列,依次为红、橙、黄、绿、青、蓝、紫。其中红光的波长范围为 0.62~0.76μm;紫光的波长范围为 0.38~0.46μm。比紫光波长还短的光叫紫外线,比红光波长还长的…

软件测试总体报告(实际项目原件Word参考)

软件全套精华资料包清单部分文件列表: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单,用户需求说明书,概要设计说明书&#xff0c…

Docker部署Azure chatgpt样例应用

Github地址 https://github.com/microsoft/sample-app-aoai-chatGPT?tabreadme-ov-file#environment-variables 使用Amazon Linux 2 AMI 的arm 64版本镜像, t4g.medium实例。 需要安装git,可能需要安装 pip3等 sudo apt-get install -y python3-pip 然后从如下…

【C++要哮着学】初识C++,什么是C++?什么是命名空间?什么又是缺省函数?

文章目录 前言1、C简介1.1、什么是C1.2、C起源1.3、C发展 2、C关键字(C98)3、命名空间3.1、命名空间的定义及使用3.2、命名空间的嵌套3.3、命名空间的三种使用方式3.3.1、加命名空间名称及作用域限定符3.3.2、使用using将命名空间中某个成员引入3.3.3、使…

CSS表格

标准的表格结构 table标签:定义表格 caption标签:定义表格标题,这个标题会居中显示在表格上,一个表格只能定义一个标题 th标签:定义表格的表头,通常成粗体居中表示 tr标签:定义表格的一行 td标…

RabbitMQ(四种使用模式)

文章目录 1.Fanout(广播模式)1.基本介绍2.需求分析3.具体实现1.编写配置类 RabbitMQConfig.java2.编写生产者,发送消息到交换机 MQSender.java3.编写消费者,接受消息 MQReceiver.java4.控制层调用方法,发送信息到交换机…

RAG应用中的路由模式

依据的用户查询意图在 RAG 应用程序使用“路由控制模式”可以帮助我们创建更强大的 RAG 应用程序。我们通常希望用户能够访问的数据可以来自各种来源,如报告、文档、图片、数据库和第三方系统。 对于基于业务的 RAG 应用程序,我们可能还希望用户能够与其它业务系统进行交互,…

卷积通用模型的剪枝、蒸馏---蒸馏篇--RKD关系蒸馏(以deeplabv3+为例)

本文使用RKD实现对deeplabv3+模型的蒸馏;与上一篇KD蒸馏的方法有所不同,RKD是对展平层的特征做蒸馏,蒸馏的loss分为二阶的距离损失Distance-wise Loss和三阶的角度损失Angle-wise Loss。 完整代码放在文末。 一、RKD简介 RKD算法的核心是以教师模型的多个输出为结构单元,取…

Infuse for Mac激活版:高清影音播放软件

对于热爱影音娱乐的Mac用户来说,Infuse for Mac是一个不容错过的选择。它以其简洁的操作界面和强大的播放功能,为用户带来了全新的影音播放体验。 Infuse for Mac支持广泛的音视频格式,无需额外转换,即可轻松播放您喜爱的影片。无…

图的概念、性质和存储与简单遍历

前置知识:树的基本概念及性质 为了保证学习效果,请保证已经掌握前置知识之后,再来学习本章节!如果在阅读中遇到困难,也可以回到前面章节查阅。 学习目标 掌握图的基本概念掌握图的一些性质 图的概念 基本概念 图 (…