长春最专业的网站建设/有广告位怎么找广告商
今日内容
上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili
同步笔记沐沐霸的博客_CSDN博客-Java2301
零、 复习昨日
一、作业
二、缓冲流
三、字符流
四、缓冲字符流
五、匿名内部类
零、 复习昨日
File: 通过路径代表一个文件或目录
方法: 创建型,查找类,判断类,其他IO
- 输入& 输出
- 字节&字符
try-catch代码
一、作业
给定路径删除该文件夹
public static void main(String[] args) {deleteDir(new File("E:\\A"));}// 删除文件夹public static void deleteDir(File file) {File[] files = file.listFiles( );for (File file1 : files) {if(file1.isFile()) { // 如果是文件,直接删除file1.delete();} else {deleteDir(file1);}}file.delete(); // 删除空文件夹}
二、缓冲字节流
演示: 拷贝一首歌
public static void main(String[] args) throws Exception {// 拷贝歌曲,耗时 183372毫秒long begin = System.currentTimeMillis( );FileInputStream fis = new FileInputStream("E:\\Angel.mp3");FileOutputStream fos = new FileOutputStream("E:\\Angel2.mp3");int b = -1;while((b = fis.read()) != -1) {fos.write(b);}fis.close();fos.close();long end = System.currentTimeMillis( );System.out.println("拷贝歌曲,耗时 " + (end - begin) + "毫秒" );}
很慢很慢~~~
原因: 一次读写一个字节,但是歌曲10M有1100万多个字节…
那么,如果可以一次读多个,写多个不就快了吗?! 是!! 那就是我们的缓冲区字节流
缓冲区字节输入流 BufferedInputStream,缓冲区字节输出流 BufferedOutputStream
之所以快,是因为它们内部有一个缓冲区数组
(长度8192),在一次读取或者写出的时候通过数组完成,即一次读取或者写出多个使用缓存区输入/输出流,需要给构造方法传入对应输入/输出流

public static void main(String[] args) throws Exception {// 拷贝歌曲,耗时 183372毫秒long begin = System.currentTimeMillis( );FileInputStream fis = new FileInputStream("E:\\Angel.mp3");FileOutputStream fos = new FileOutputStream("E:\\Angel2.mp3");// 创建缓冲区输入.输出流BufferedInputStream bis = new BufferedInputStream(fis);BufferedOutputStream bos = new BufferedOutputStream(fos);int b = -1;while((b = bis.read()) != -1) {bos.write(b);}bis.close();bos.close();// 内部是数组传输数据,最后一次输出数据时,数组不一定装满// 如果执行close,会关流的同时会强制刷新剩余数据输出// 也可以执行flush手动刷新// bos.flush();long end = System.currentTimeMillis( );System.out.println("拷贝歌曲,耗时 " + (end - begin) + "毫秒" );}
三、字符流
字节流适合读取二进制文件,读取字符数据可能会乱码!
建议读取字符,采用字符流!
字符流有两个抽象父类
- Reader (字符输入流 )
- Writer (字符输出流)
一般使用其子类
- FileReader
- FileWriter
3.1 FileReader
构造方法
- FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。
- FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
方法
- int read() 读取单个字符。
读完末尾返回-1
- int read(char[] cbuf) 将字符读入数组。
- void close() 关闭该流并释放与之关联的所有资源。
public static void main(String[] args) throws Exception {FileReader fr = new FileReader("a.txt");int ch = -1;while((ch = fr.read()) != -1) {System.out.println((char)ch );}fr.close();}
FileReader fr = new FileReader("a.txt");char[] chars = new char[4]; // 创建空字符数组fr.read(chars); // 一次读取数组长度个字符,存储到数组中System.out.println(Arrays.toString(chars ) );fr.close();
3.2 FileWriter
FileWriter在创建时,内部默认构造一个缓冲数组,用于一次写出多个,大小是1024字节
构造方法
- FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。
- FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。
- FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
- FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
append指定成true,在原文件后面追加,指定成false,覆盖原文件
如果不知道,默认就是false
方法
- void close() 关闭此流,但要先刷新它。
- void flush() 刷新该流的缓冲。
- void write(char[] cbuf) 写入字符数组。
- void write(int c) 写入单个字符。
- void write(String str) 写入字符串。
- void write(String str, int off, int len) 写入字符串的某一部分。
public static void main(String[] args) throws Exception {FileWriter fw = new FileWriter("a.txt");// 写字符fw.write('j');// 写字符串fw.write("java");// 写字符数组char[] chars = {'a','b','c'};fw.write(chars);// 写字符串中一部分内容String str = "javabigdata";fw.write(str,4,3);// 因为有缓冲区,不关流的话有些数据无法输出// 因为没有达到缓冲区大小//fw.close();// 也可以强制刷新出来fw.flush();}
3.3 练习 复制小说
使用 踹凯吃 来完成
public static void main(String[] args) {long begin = System.currentTimeMillis( );FileReader fr = null;FileWriter fw = null;try {fr = new FileReader("E:\\《雪中悍刀行》.txt");fw = new FileWriter("E:\\血刀.txt");int ch = -1;while((ch = fr.read()) != -1) {fw.write(ch);}} catch (Exception e) {e.printStackTrace( );} finally {try {fr.close();fw.close();} catch (IOException e) {e.printStackTrace( );}}long end = System.currentTimeMillis( );System.out.println("拷贝小说,耗时 " + (end - begin) + "毫秒" );}
3.4 练习
使用字符流把a文件中的数据转换后写到b文件中
要求:1) 大写转换为小写 2)小写转换为大写 3)删除数字
四、缓冲字符流
BufferedReader BufferedWriter
缓冲区字符输入输出流,内部在创建对象时会构建一个长度为8192的缓冲数组.ps: 查看构造方法源码…
BufferedReader
构造方法
- BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
方法
- int read() 读取单个字符。
- String readLine() 读取一个文本行。
- void close() 关闭该流并释放与之关联的所有资源。
BufferedWriter
构造方法
- BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
方法
- void close() 关闭此流,但要先刷新它。
- void flush() 刷新该流的缓冲。
- void newLine() 写入一个行分隔符。
- void write(int c) 写入单个字符。
- void write(String s) 写入字符串
public static void main(String[] args) {long begin = System.currentTimeMillis( );FileReader fr = null;FileWriter fw = null;BufferedReader br = null;BufferedWriter bw = null;try {fr = new FileReader("E:\\《雪中悍刀行》.txt");fw = new FileWriter("E:\\血刀.txt");br = new BufferedReader(fr);bw = new BufferedWriter(fw);int ch = -1;// 一次读一个放入缓冲区// while((ch = br.read()) != -1) {// bw.write(ch);// 写一个字符// }String line = null;// 一次读取一行,读取到换行终止符结束并返回,但是不包含终止符while((line = br.readLine()) != null) {bw.write(line); // 写一行字符串// 写出一个换行符// bw.write("\r\n");bw.newLine();}} catch (Exception e) {e.printStackTrace( );} finally {try {br.close();bw.close();} catch (IOException e) {e.printStackTrace( );}}long end = System.currentTimeMillis( );System.out.println("拷贝小说,耗时 " + (end - begin) + "毫秒" );}
练习
读取一个文本,按行倒着输出,即读取的第一行输出在最后一行,读取的第二行,输出在倒数第二行.
思路: 不能读完直接输出了,而是读一行,向集合中存一行.读取完毕后,倒着遍历集合即可
public static void main(String[] args) {long begin = System.currentTimeMillis( );BufferedReader br = null;BufferedWriter bw = null;try {br = new BufferedReader(new FileReader("E:\\a.txt"));bw = new BufferedWriter(new FileWriter("E:\\a2.txt"));ArrayList<String> list = new ArrayList<>( );// 读取每一行,转入集合String line = null;while((line = br.readLine()) != null) {list.add(line);}// 倒着遍历集合for (int i = list.size() - 1;i >= 0;i--) {String s = list.get(i);bw.write(s);bw.newLine();}} catch (Exception e) {e.printStackTrace( );} finally {try {br.close();bw.close();} catch (IOException e) {e.printStackTrace( );}}long end = System.currentTimeMillis( );System.out.println("倒着拷贝,耗时 " + (end - begin) + "毫秒" );}
练习
1. 将上面歌词内容存放到本地磁盘D根目录,文件命名为 `word.txt`
2. 选择合适的IO流读取word.txt文件的内容
3. 统计每个单词出现的次数(单词忽略大小写)
4. 如果出现组合单词如 `you're`按一个单词处理
5. 将统计的结果存储到本地磁盘D根目录下的`wordcount.txt`文件
【该题使用缓冲字符流更好】
wordcout.txt每行数据个数如下
you --> 9次
my --> 9次
I --> 9次
public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new FileReader("E:\\word.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\wordcount.txt"));// TreeMap会有排序效果TreeMap<String, Integer> map = new TreeMap<>( );String line = null;while((line = br.readLine()) != null) {// 将每行字符串拆分成单个单词String[] strArr = line.split(" ");for (String s : strArr) {// 将每个单词全部转成小写String lowerStr = s.toLowerCase( );// 判断是否存在if (map.containsKey(lowerStr)) {Integer count = map.get(lowerStr); // 如果存在,则取出count++; // 次数+1map.put(lowerStr,count); // 再存入} else {map.put(lowerStr,1); // 如果不包含,即第一次存,次数1}}}// 输出Set<Map.Entry<String, Integer>> entrySet = map.entrySet( );for (Map.Entry<String, Integer> entry : entrySet) {String word = entry.getKey( );Integer count = entry.getValue( );bw.write(word + " ---> "+count+"次");bw.newLine();}br.close();bw.close();}
五、IO流总结
画思维导图 https://www.processon.com/view/link/6360e893f346fb33540a61c1 访问密码:2301
六、匿名内部类
ps: 为了明天讲多线程做准备,会用到匿名内部类这个知识
思考一个问题?
假如有一个接口,现在让你创建一个接口的实现类对象,该怎么做?
换句话,有个方法,参数列表是接口,应该如何调用?
解决:
先创建一个类,实现接口,重写方法
创建对象
现在有个更简单的写法,可以不用创建类就可以实现出一个接口的实现类
// 接口
public interface USB {void run();
}
public static void main(String[] args) {// 有一个接口,现在让你创建一个接口的实现类对象// new USBImpl();// test(new USBImpl());// 就相当于是创建了USB接口的实现类,并且重写了方法// 这就是匿名内部类test(new USB(){@Overridepublic void run() {System.out.println("匿名实现.." );}});// 这样是将匿名内部类,取了名字叫usbUSB usb = new USB(){@Overridepublic void run() {System.out.println("匿名实现.." );}};test(usb);}public static void test(USB usb) {usb.run();}
总结: 匿名内部类就是简化了创建子类对象的过程.
实战
使用匿名内部类完成. 创建TreeSet时指定比较器.
相关文章:

day22_IO
今日内容 上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili 同步笔记沐沐霸的博客_CSDN博客-Java2301 零、 复习昨日 一、作业 二、缓冲流 三、字符流 四、缓冲字符流 五、匿名内部类 零、 复习昨日 File: 通过路径代表一个文件或目录 方法: 创建型,查找类,判断类,其他 IO …...

第三十八章 linux-并发解决方法二(信号量)
第三十八章 linux-并发解决方法二(信号量) 文章目录第三十八章 linux-并发解决方法二(信号量)信号量的定义DOWN操作UP操作相对于自旋锁,信号量的最大特点是允许调用它的线程进入睡眠状态这意味着试图获得某一信号的进程…...

数据结构-考研难点代码突破(C++实现树型查找 - B树插入与遍历,B+树基本概念)
数据结构(C)[B树(B-树)插入与中序遍历,效率分析]、B树、B*树、B树系列应用 文章目录1. B树B树的插入与删除流程2. B树(MySQL)3. B树与B树对比4. C实现B树插入,中序遍历1. B树 B树类…...

Python可视化界面编程入门
Python可视化界面编程入门具体实现代码如所示: (1)普通可视化界面编程代码入门: import sys from PyQt5.QtWidgets import QWidget,QApplication #导入两个类来进行程序界面编程if __name__"__main__":#创建一个Appl…...

基于Java+SpringBoot+Vue前后端分离书店购书系统设计与实现
博主介绍:✌全网粉丝3W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品:《微服务实战》专栏是本人的实战经验总结,《Spring家族及…...

Android:截屏/视频截图
需求描述 实现截取Android应用当前界面的功能,需包含界面中视频(此博客的参考代码以存储在设备本地的视频为例,未检验在线视频的情况)当前的播放帧截图。 调研准备 首先应用需要获取设备存储的读写权限,需要在Andro…...

leecode-C语言实现-28. 找出字符串中第一个匹配项的下标
一、题目给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。示例 1:输入:haystack …...

使用 Postman 实现 API 自动化测试
目录:导读 背景介绍 名词解析 使用说明 执行 API 测试 集成 CI 实现 API 自动化测试 写在最后 背景介绍 相信大部分开发人员和测试人员对 postman 都十分熟悉,对于开发人员和测试人员而言,使用 postman 来编写和保存测试用例会是一种比…...

k8s环境jenkins发布vue项目指定nodejs版本
k8s环境jenkins发布vue项目指定nodejs版本1、背景2、分析3、解决方法3.1、 找到配置镜像位置3.2、 制作新镜像3.3、 推送镜像到私有仓库3.4、 修改配置文件1、背景 发布一个前端项目,它需要nodejs 16.9.0版本支持,而kubesphere 3.2.0集成的jenkins 的镜…...

我应该把毕业设计做到什么程度才能过关?
本篇博客包含了狗哥多年职业生涯对于软件项目的一丢丢理解,也讲述了对于大学生毕业设计的一些理解。如果你还是懵懵懂懂就要离开学校了,被老师告知不得不做出一套毕业设计的时候,希望你可以看到这篇博客,让你有点头绪,…...

力扣-合作过至少三次的演员和导演
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:1050. 合作过至少三次的演员和导演二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运…...

【 PMU】信号生成、采样、分割、估计器应用和误差计算(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...

电子技术——AB类输出阶的偏置
电子技术——AB类输出阶的偏置 下面我们介绍两种AB类输出阶的偏置的方法。 使用二极管偏置 下图展示了电流源 III 加两个二极管的偏置方法: 因为输出阶需要大功率输出,因此输出推挽三极管可能是几何体积比较大的晶体管。对于二极管来说,并不…...

元宇宙营业厅,数字技术融合,赋能实体经济
在我国数字经济与虚拟服务市场规模扩大下,元宇宙营业厅强势来袭,从多场景、多内容,深耕高效协同的特色功能,基于多元化、灵活的交互体验,更大程度上解决线上业务办理抽象繁琐,线下业务办理的时空受限、业务…...

MySql面试精选—分库分表
目录 1、分库分表使用场景 2、常见的分库分表方案 3、常用的分库分表中间件...

Spring上下文生命周期
基于入口来分析 import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration;Configuration ComponentScan public cl…...

GitHub 标星 15w,如何用 Python 实现所有算法?
学会了 Python 基础知识,想进阶一下,那就来点算法吧!毕竟编程语言只是工具,结构算法才是灵魂。 新手如何入门 Python 算法? 几位印度小哥在 GitHub 上建了一个各种 Python 算法的新手入门大全。从原理到代码…...

LeetCode 700. 二叉搜索树中的搜索
LeetCode 700. 二叉搜索树中的搜索 难度:easy\color{Green}{easy}easy 难度:middle\color{orange}{middle}middle 难度:hard\color{red}{hard}hard 题目描述 给定二叉搜索树(BST)的根节点 rootrootroot 和一个整数值…...

【数据结构】树与二叉树
目录 1、树的概念及结构 1.1、概念 1、树的特点 2、树与非树 1.2、概念 (重要) 1.3、树的表示形式 2、二叉树(重点) 2.1、概念 2.2、二叉树的特点 2.3、两种特殊的二叉树 1、满二叉树 2、完全二叉树 2.4、二叉树的性…...

Stress压力工具的部署及使用
Stress压力工具的部署及使用 下载地址:wget https://fossies.org/linux/privat/old/stress-1.0.5.tar.gz 1.部署 进入目录执行./autogen.sh [rootiZ2ze1pj93eyq389c2ppi5Z stress-1.0.5]# ./autogen.sh ps:如果执行过程中缺包,安装对应的…...

[蓝桥杯 2020 省 AB3] 乘法表
题目描述九九乘法表是学习乘法时必须要掌握的。在不同进制数下,需要不同的乘法表。例如, 四进制下的乘法表如下所示:1*11 2*12 2*210 3*13 3*212 3*321请注意,乘法表中两个数相乘的顺序必须为样例中所示的顺序,不能随意交换两个乘…...

Python基础知识
基础知识 基础知识包括输入输出、变量、数据类型、表达式、运算符这5个方面。 1.输入输出 Python有很多函数,后面我们会细讲,但这里先将两个最基本的函数:输入和输出。 输出函数print(),在前面我们已经用过了,语法…...

FME案例实战教程:聚焦实战应用,摆脱思路束缚,您值得拥有
一、教程链接(一)FME案例实战教程链接1.FME案例实战教程(完整版) ☚强烈推荐☚2.FME案例实战教程(A组)3.FME案例实战教程(B组)4.FME案例实战教程(C组)&#…...

【JavaScript】根据元素内容遍历元素的方案
▒ 目录 ▒🛫 导读需求1️⃣ jQuery2️⃣ XPATH(document.evaluate)3️⃣ 原生js(querySelectorAll & Array)🛬 文章小结📖 参考资料🛫 导读 需求 因业务需要,根据元…...

kafka全解
目录Kafka概述定义消息队列目录结构分析传统消息队列的应用场景消息队列的两种模式点对点模式发布/订阅模式Kafka基础架构Kafka快速入门安装部署集群规划集群部署集群启停脚本Kafka命令行操作Kafka基础架构主题命令行操作生产者命令行操作消费者命令行操作kafka可视化工具Kafka…...

(三)随处可见的LED广告屏是怎么工作的呢?接入GUI
续上文,本篇我们将尝试接入一个GUI来控制点阵屏。在前两篇中,我们相继介绍了点阵屏的控制原理,以及如何让点阵屏按照我们所想的进行显示。本篇将在此基础上接入一个GUI,使点阵屏的控制更加优雅。限于阅读体验和展示效果࿰…...

线程池简介
线程池 线程池(英语:thread pool):一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时…...

大数据面试题集锦-Hadoop面试题(四)-YARN
你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案。如果你需要更多的面试经验和面试题,关注一下"张飞的猪大数据分享"吧,公众号会不定时的分享相关的知识和资料。 文章目录1、为什么会产生 yarn,它解决了什么问题…...

Python---time模块
专栏:python 个人主页:HaiFan. 专栏简介:Python在学,希望能够得到各位的支持!!! time模块前言时间戳time.time()将时间戳转换成字符串time.ctime()将时间戳转换为元组time.localtime(时间戳)将元…...

坚鹏:学习贯彻二十大精神 解码共同富裕之道(面向银行)
学习贯彻二十大精神 解码共同富裕之道课程背景: 很多银行从业人员存在以下问题:不知道如何准确解读二十大精神?不清楚共同富裕相关政策要求?不知道如何有效推动共同富裕? 课程特色:有实战案例有…...