201621123062《java程序设计》第12周作业总结
1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容。
思维导图:
2. 面向系统综合设计-图书馆管理系统或购物车
使用流与文件改造你的图书馆管理系统或购物车。
2.1 简述如何使用流与文件改造你的系统。文件中数据的格式如何?
简述:
购物车:在控制台商城里的物品写入文件然后在增删物品的时候也要对文件进行修改
数据格式:十六进制
2.2 简述系统中文件读写部分使用了流与文件相关的什么接口与类?为什么要用这些接口与类?
接口:Serializable接口
类: ObjectOutputStream
原因:使用对象流是因为发现要写入的应该是物品,这是一个对象,所以用对象流。
使用Serializable接口是因为我想把商品类的物品写进文件用于存储数据,一开始直接使用了ObjectOutputStream ,但是在运行的时候系统报错了
后来问了一下大佬,说是需要Serializable接口,并且应该是存的类(即商品类)实现这个接口,然后程序就不会报错了
**查找了一下这个接口的资料: **
1.所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。
2.实现java.io.Serializable 接口的类是可序列化的
个人理解:可序列化的类实现了Serializable接口就可以保存到文件中
2.3 截图读写文件相关代码。关键行需要加注释。
(因为一开始没想好实现的类,先用了数据流,发现只能写入基本数据类型,后面改用对象流,写了一部分写入文件的代码)
相关代码:
运行结果:(这是个乱码,大佬说是因为存入文件的是一个对象- - 其实我不太清楚这个)
3. 代码量统计
3.1 统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中。
周数 | 行数 | 新增行数 | 文件数 | 新增文件数 |
---|---|---|---|---|
1 | 57 | 57 | 5027 | 5027 |
2 | 400 | 400 | 10 | 10 |
3 | 508 | 508 | 23 | 13 |
5 | 609 | 609 | 31 | 8 |
6 | 612 | 612 | 40 | 9 |
7 | 584 | 584 | 46 | 6 |
8 | 432 | 432 | 50 | 4 |
9 | 620 | 620 | 56 | 6 |
10 | 468 | 468 | 60 | 4 |
11 | 476 | 476 | 67 | 7 |
12 | 593 | 593 | 74 | 7 |
13 | 646 | 646 | 82 | 8 |
4.选做:流与文件学习指导(底下的作业内容全部都是选做)
4.1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读)
将Student对象(属性:int id, String name,int age,double grade)写入文件student.data、从文件读出显示。
4.1.1 生成的三个学生对象,使用PrintWriter的println方法写入student.txt,每行一个学生,学生的每个属性之间用|作为分隔。使用Scanner或者BufferedReader将student.txt的数据读出。(截图关键代码,出现学号)
关键代码:
运行截图:
4.1.2 生成文件大小多少(使用右键文件属性查看)?分析该文件大小。
文件大小:
分析:
按照 每个中文字符两个字节,每个英文字符以及”|”一个字节,换行符两个字节 计算:
第一、二、三行:16*3=48字节
第四行:16+2-1=17字节(多了一个中文2字节,最后一个数据少了一个数字1字节)
计算文件大小:48+17=65字节
4.1.3 如果调用PrintWriter的println方法,但在后面不close。文件大小是多少?为什么?
文件大小:
原因:由于PrintWriter内部使用了缓冲区,则根据缓冲区原理,当缓冲区满时才真正进行底层操作。如果调用PrintWriter的println方法,但在后面不close,则最后的字节可能并不会被传送出去,可能会造成数据的丢失。
4.2. 缓冲流
4.2.1 使用PrintWriter往文件里写入1千万行(随便什么内容都行),然后对比使用BufferedReader与使用Scanner从该文件中读取数据的速度(只读取,不输出),使用哪种方法快?截取测试源代码,出现学号。请详细分析原因?提示:可以使用junit4对比运行时间
测试代码:
运行结果:
使用BufferedReader方法快
原因:BufferedReader是字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取,而且也可以设置缓冲区的大小,由于BufferedReader的缓冲区比Scanner的更大,在使用时减少读取文本的操作次数,所以速度更快。
4.2.2 将PrintWriter换成BufferedWriter,观察写入文件的速度是否有提升。记录两者的运行时间。试分析原因。
关键代码:
运行截图:
原因分析:BufferedWriter比PrintWriter快。
PrintWriter和BufferedWriter都是继承java.io.Writer,所以很多功能都一样。虽然PrintWriter内部也使用缓冲区,但是BufferedWriter可以任意设定缓冲区大小,写入文件的速度更快。
4.3. 字符编码
4.3.1 现有EncodeTest.txt 文件,包含一些中文,该文件使用UTF-8编码。使用FileReader与BufferedReader将EncodeTest.txt的文本读入并输出。是否有乱码?为什么会有乱码?如何解决?(截图关键代码,出现学号)
其实一开始我的并没有乱码- - 百度说是window默认下是用GBK编码的,所以我先给它调成了UTF8编码。。
运行结果:
原因:有乱码是因为FileReader只能按系统默认的字符集(如GBK)来解码,但是自己新建的文件是按照UTF-8进行编码,因此将UTF-8编码的字符使用GBK编码来解析,就会出现乱码。
解决:手动设置了一下eclipse上的编码方式。。。。具体代码方法见下图:
4.3.2 编写方法convertGBK2UTF8(String src, String dst),可以将以GBK编码的源文件src转换成以UTF8编码的目的文件dst。
编写方法:
运行结果: