201621123086 《Java程序设计》第12周学习总结
1. 本周学习总结
- 自 Inputstream或Reader派生而来的类都含有名为read()的基本方法,用于读取单字节或字节数组。同样,任何自OutputStream或Writer派生而来的类都含有名为write()的基本方法,用于写单个字节或者字节数组.但是,我们通常不会用到这些方法。
- 从不同数据源产生输入的类有对应的InputStream子类。
- BufferedReader构造器,提供readLine()方法。
- 用DateInputStream. 它是一个面向字节的I/O类,必须使用InputStream类
2. 面向系统综合设计-图书馆管理系统或购物车
2.1 简述如何使用流与文件改造你的系统。文件中数据的格式如何?
我使用的是BufferedWriter
类与BufferedReader
类,将书籍与用户的属性用空格间隔起来。数据以字符串的形式保存在.txt文件里。
2.2 简述系统中文件读写部分使用了流与文件相关的什么接口与类?为什么要用这些接口与类?
- 读取时用到了
File
类,FileReader
类、BufferedReader
类,通过File创建文件对象,另两个类配合进行读取。 - 写入文件用到了
BufferedWriter
、OutputStreamWriter
、FileOutputStream
。
2.3 截图读写文件相关代码。关键行需要加注释
3. 代码量统计
3.1 统计本周完成的代码量
周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
1 | 0 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 0 |
3 | 619 | 619 | 15 | 15 |
4 | 619 | 0 | 15 | 0 |
5 | 973 | 354 | 25 | 10 |
6 | 1394 | 421 | 37 | 12 |
7 | 2001 | 607 | 43 | 6 |
8 | 4046 | 2045 | 54 | 11 |
9 | 4486 | 440 | 64 | 10 |
10 | 4808 | 322 | 67 | 3 |
11 | 4974 | 166 | 70 | 3 |
12 | 6118 | 1144 | 86 | 16 |
13 | 6454 | 336 | 92 | 6 |
选做:4. 流与文件学习指导
1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读)
1.1 生成的三个学生对象,使用PrintWriter的println方法写入student.txt,每行一个学生,学生的每个属性之间用|作为分隔。使用Scanner或者BufferedReader将student.txt的数据读出。(截图关键代码,出现学号)
1.2 生成文件大小多少(使用右键文件属性查看)?分析该文件大小
英文字符、一位数字、占位符、小数点各占一字节;
换行两字节
总共13字节
1.3 如果调用PrintWriter的println方法,但在后面不close。文件大小是多少?为什么?
0字节
如果未调用close()
关闭,则内容停留在缓冲区。
2. 缓冲流
2.1 使用PrintWriter往文件里写入1千万行(随便什么内容都行),然后对比使用BufferedReader与使用Scanner从该文件中读取数据的速度(只读取,不输出),使用哪种方法快?截取测试源代码,出现学号。请详细分析原因?提示:可以使用junit4对比运行时间
- 原因在于
BufferedReader
缓冲区更大,减少了读取与输入次数。
2.2 将PrintWriter换成BufferedWriter,观察写入文件的速度是否有提升。记录两者的运行时间。试分析原因。
- 原因同样在于
BufferedWriter
有更大的缓冲区。
4. 字节流、二进制文件:DataInputStream, DataOutputStream、ObjectInputStream
4.1 参考DataStream目录相关代码,尝试将三个学生对象的数据写入文件,然后从文件读出并显示。(截图关键代码,出现学号)
4.2 这里生成的文件和题目1生成的文件有何不一样?生成的文件有多大?分析该文件大小?将该文件大小和题目1生成的文件对比是大了还是小了,为什么?存储数据的时候,到底是二进制文件比较节省空间还是文本文件比较节省空间?使用二进制存储文件有何好处?
- 明显相对较大
- 一般来讲二进制文件较为节省空间
- 优点在于:节省空间、读取速度快、存储较为精确
4.3 使用wxMEdit的16进制模式(或者其他文本编辑器的16进制模式)打开student.data,分析数据在文件中是如何存储的。
00 00 00 01对应数字1
00 03 61 61 61对应字符aaa
00 00 00 02对应数字2
3f f0 00 00 00 00 00 00对应数字1.0
4.4 使用ObjectInputStream(读), ObjectOutputStream(写)读写学生。(截图关键代码,出现学号) //参考ObjectStreamTest目录
8. 正则表达式
8.1 使用正则表达式判断给定的字符串是否是10进制数字格式?尝试编程进行验证,要给测试数据集及运行结果(可以转化为PTA)。(截图关键代码,出现学号)
8.2 解释自己编写的正则表达式。
首先,字符串"\"被编译器转义"",所以所有正则中出现的""要写为"\"
"-?\d+(\.\d+)?"
随后,"-?"中的"?"代表可以有一个前面的字符——负号,也可以没有;而“\d”则匹配一个数字字符;“+”匹配最少一个前面的字符;()?代表前面的子字段可以有一个,也可以没有;
子字段中,“\.”是小数点字符,其余的前面已经讲过。
8.3 选做:修改HrefMatch.java,尝试匹配网页中的数字字符串、匹配网页中的图片字符串。(可以转化为PTA)
ps.http://cec.jmu.edu.com/会出现java.net.UnknownHostException
,暂时解决不了,所以用的原地址。
pps.对正则表达还是不太熟悉,只能做到这一步,应该是漏掉了一部分图片