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

缓冲流练习

练习1:拷贝文件

四种方式拷贝文件,并统计各自用时。
字节流的基本流:一次读写一个字节
字节流的基本流:一次读写一个字节数组
字节缓冲流:一次读写一个字节
字节缓冲流:一次读写一个字节数组

这里我只使用了字节缓冲流进行实现,分别是一次读写一个字节和一次读写一个字节数组。

我写的时候还有一个问题就是我搁那拷贝文件夹呢,一直出现 D:\垃圾邮件\chinese-spam-filter-master (拒绝访问。)这种错误,原因就是流操作的是文件,路径不对,解决了半天。

public class BIO4 {public static void main(String[] args) throws IOException {//method1();method2();}private static void method1() throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\Java学习资料\\day10-字符串\\笔记\\常用API.md"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bbb.md"));int b;long startTime = System.currentTimeMillis();while ((b = bis.read()) != -1) {bos.write(b);}long endTime = System.currentTimeMillis();bos.close();bis.close();System.out.println(endTime - startTime);}private static void method2() throws IOException {BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\\Java学习资料\\day10-字符串\\笔记\\常用API.md"));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bbb.md"));byte[] buffer = new byte[1024 * 1024 * 5];int len;long startTime = System.currentTimeMillis();while ((len = bis.read(buffer)) != -1) {bos.write(buffer, 0, len);}long endTime = System.currentTimeMillis();bos.close();bis.close();System.out.println(endTime - startTime);}
}

练习2: 修改文本顺序

需求:把《出师表》的文章按顺序恢复到一个新的文件中。

下面就是需要恢复顺序的《出师表》的文章,前面的序号是文章的正确顺序。

3.侍中、侍郎郭攸之、费祎、董允等,此皆良实,志虑忠纯,是以先帝简拔以遗陛下。愚以为宫中之事,事无大小,悉以咨之,然后施行,必得裨补阙漏,有所广益。
8.愿陛下托臣以讨贼兴复之效,不效,则治臣之罪,以告先帝之灵。若无兴德之言,则责攸之、祎、允等之慢,以彰其咎;陛下亦宜自谋,以咨诹善道,察纳雅言,深追先帝遗诏,臣不胜受恩感激。
4.将军向宠,性行淑均,晓畅军事,试用之于昔日,先帝称之曰能,是以众议举宠为督。愚以为营中之事,悉以咨之,必能使行阵和睦,优劣得所。
2.宫中府中,俱为一体,陟罚臧否,不宜异同。若有作奸犯科及为忠善者,宜付有司论其刑赏,以昭陛下平明之理,不宜偏私,使内外异法也。
1.先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。然侍卫之臣不懈于内,忠志之士忘身于外者,盖追先帝之殊遇,欲报之于陛下也。诚宜开张圣听,以光先帝遗德,恢弘志士之气,不宜妄自菲薄,引喻失义,以塞忠谏之路也。
9.今当远离,临表涕零,不知所言。
6.臣本布衣,躬耕于南阳,苟全性命于乱世,不求闻达于诸侯。先帝不以臣卑鄙,猥自枉屈,三顾臣于草庐之中,咨臣以当世之事,由是感激,遂许先帝以驱驰。后值倾覆,受任于败军之际,奉命于危难之间,尔来二十有一年矣。
7.先帝知臣谨慎,故临崩寄臣以大事也。受命以来,夙夜忧叹,恐付托不效,以伤先帝之明,故五月渡泸,深入不毛。今南方已定,兵甲已足,当奖率三军,北定中原,庶竭驽钝,攘除奸凶,兴复汉室,还于旧都。此臣所以报先帝而忠陛下之职分也。至于斟酌损益,进尽忠言,则攸之、祎、允之任也。
5.亲贤臣,远小人,此先汉所以兴隆也;亲小人,远贤臣,此后汉所以倾颓也。先帝在时,每与臣论此事,未尝不叹息痛恨于桓、灵也。侍中、尚书、长史、参军,此悉贞良死节之臣,愿陛下亲之信之,则汉室之隆,可计日而待也。

首先需要把文章中的所有内容读取出来之后,才能进行后续的操作,所以要先放到集合中。至于是哪种集合则需要根据需求进行考虑。

分析:

  1. 读取文章的所有内容放到集合中;
  2. 对集合中的内容按照规则进行排序;
  3. 再写入到文件中。

关于步骤1没什么好说的,都一样,但是选取的集合有两种。

实现一:

首先考虑到的就是TreeMap集合,因为可以进行排序。

关于写入文件在这里是集合中的元素一个一个单独写入的。

public class BIO5 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("bbb//csb.txt"));String str;TreeMap<Integer, String> tm = new TreeMap<>();while ((str = br.readLine()) != null) {String[] s = str.split("\\.");tm.put(Integer.parseInt(s[0]), s[1]);}br.close();// 将汉字写入BufferedWriter bw = new BufferedWriter(new FileWriter("bbb//copy.txt"));for (Integer i : tm.keySet()) {String s = tm.get(i);bw.write(s);bw.newLine();}bw.close();

其实还可以一下全部写入:采用toString()方法将集合中的内容转换为字符串。

String s = tm.toString().replace(", ", "\n").replace("=", ".");
bw.write(s);
bw.close();

实现二:视频里还有一种思路用的是ArrayList集合。

全部元素添加完成后使用集合工具类Collections的sort方法进行排序,并指定排序规则。这个方法虽然也可以实现,但我觉得并不是很好,因为有可排序的集合存在,要挑选更好的使用。

        BufferedReader br = new BufferedReader(new FileReader("bbb//csb.txt"));String str;ArrayList<String> list = new ArrayList<>();while ((str = br.readLine()) != null) {list.add(str);}Collections.sort(list, new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int i1 = Integer.parseInt(o1.split("\\.")[0]);int i2 = Integer.parseInt(o2.split("\\.")[0]);return i1 - i2;}});

Tips:当向文件中写入数据时没有关闭流时会发现数据并没有写入,是因为没有把数据刷新进去。  

练习3:软件运行次数

实现一个验证程序运行次数的小程序,要求如下:
1.当程序运行超过3次时给出提示:本软件只能免费使用3次,欢迎您注册会员后继续使用~
2.程序运行演示如下:
第一次运行控制台输出:欢迎使用本软件,第1次使用免费~
第二次运行控制台输出:欢迎使用本软件,第2次使用免费~
第三次运行控制台输出:欢迎使用本软件,第3次使用免费~
第四次及之后运行控制台输出:本软件只能免费使用3次,欢迎您注册会员后继续使用~

在这个练习中以前都是在程序中运行,与内存打交道,程序运行结束时数据就不存在了。但是现在学习了IO,就可以将数据写入到外部文件中了,将数据进行保存。

分析:

1、运行程序时首先读取文件中保存的次数;

2、然后进行比较再决定是否写入。

代码实现:

public class BIO7 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("bbb/count.txt"));String s = br.readLine();BufferedWriter bw = new BufferedWriter(new FileWriter("bbb/count.txt"));if (s == null) {bw.write("1");System.out.println("欢迎使用本软件,第1次使用免费~");} else {int count = Integer.parseInt(s);if (count >= 3) {System.out.println("本软件只能免费使用3次,欢迎您注册会员后继续使用~");} else {count++;bw.write(Integer.toString(count));System.out.println("欢迎使用本软件,第"+ count +"次使用免费~");}}bw.close();br.close();}
}

但是在视频中却是先创建出文件,然后手动写入次数0。 

 问题:-1转换为char类型的值为什么是'\uFFFF' ?

在Java中,char 类型是一个 16 位的无符号整数,范围从 0 到 65535(即 0x0000 到 0xFFFF)。当你将一个整数赋给 char 类型时,会发生强制类型转换,整数的值将被解释为对应的 Unicode 字符。

如果你将整数 -1 转换为 char 类型,实际上是将其视为 Unicode 码点 0xFFFF​​,即特殊符号 REPLACEMENT CHARACTER(�),它通常表示未知字符或无法识别的字符。

下面是将 -1 转换为 char 类型的示例代码:

int num = -1;
char ch = (char) num;
System.out.println("Unicode code point of -1 is: " + (int) ch);  // 输出 65535
System.out.println("Character represented by -1 is: " + ch);     // 输出 \uFFFF

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • js第二天
  • 最强开源文生图模型一夜易主!SD一作、Stabililty AI核心成员Robin Rombach下场创业了,一出手就是王炸。
  • Python 爬虫项目实战(一):爬取某云热歌榜歌曲
  • E23.【C语言】练习:不创建第三个变量实现两个整数的交换
  • 锂电池生产工艺数字化的业务架构.pptx
  • 可视化图表与源代码显示的动态调整
  • vite静态资源处理,处理vite项目中src和url路径问题
  • DedeCMS-V5.7.82-UTF8织梦
  • 复现一下最近学习的漏洞(sqlab 1-10)
  • 速盾:爬虫攻击和cc攻击的区别是什么?
  • Git在日常项目中的实用技巧
  • 汉诺塔(C++)
  • 2024华数杯数学建模A题完整论文讲解(含每一问python代码+结果+可视化图)
  • 总线学习4--UART
  • pom.xml和.m2的setting的区别?
  • 《Java编程思想》读书笔记-对象导论
  • Centos6.8 使用rpm安装mysql5.7
  • create-react-app做的留言板
  • JAVA_NIO系列——Channel和Buffer详解
  • JS笔记四:作用域、变量(函数)提升
  • Promise面试题2实现异步串行执行
  • Python实现BT种子转化为磁力链接【实战】
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue自定义指令实现v-tap插件
  • Web Storage相关
  • web标准化(下)
  • 从输入URL到页面加载发生了什么
  • 前端
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端性能优化——回流与重绘
  • 一道闭包题引发的思考
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (多级缓存)缓存同步
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (四)图像的%2线性拉伸
  • (一)utf8mb4_general_ci 和 utf8mb4_unicode_ci 适用排序和比较规则场景
  • (转)创业家杂志:UCWEB天使第一步
  • .Net Core 生成管理员权限的应用程序
  • .net 程序发生了一个不可捕获的异常
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .net网站发布-允许更新此预编译站点
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • [ 渗透工具篇 ] 一篇文章让你掌握神奇的shuize -- 信息收集自动化工具
  • [@Controller]4 详解@ModelAttribute
  • [20160807][系统设计的三次迭代]
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [C++][ProtoBuf][初识ProtoBuf]详细讲解
  • [cb]UIGrid+UIStretch的自适应
  • [CF]Codeforces Round #551 (Div. 2)
  • [docker] Docker容器服务更新与发现之consul