Java第13周作业
1.本周学习总结
1.1以你喜欢的方式(思维导图或其他)归纳总结集合相关内容。
-
思维导图
-
要进行输入、输出操作的话一般流程(在这里以文件操作为例子)
| - 通过File
类定义一个要操作文件的路径(如果不是文件就没有这一步了)
| - 通过字节流或者字符流的子类对象为父类对象实例化
| - 进行数据的读(输入),写(输出)操作
| - 数据流属于资源操作,资源操作必须关闭 -
对于java.io 包而言,定义了两类流:
| - 字节流(JDK 1.0):InputStream、OutputStream
| - 字符流(JDK 1.1):Reader、Writer -
字节流与字符流的区别
| - 字节流与字符流最大的区别:字节流直接与终端文件进行数据交互,字符流需要将数据经过缓冲区处理才与终端文件数据交互。
| - 在使用OutputStream输出数据时即使最后没有关闭输出流,内容也可以正常输出,但是如果在使用字符输出流Writer,在执行最后如果不关闭输出流,就表示在缓冲区中处理的内容不会被强制性清空,所以就不会输出数据。PS:可以用flush()
方法强制清空缓冲区。 -
关于字节流与字符流的小总结:
| - 在开发中对于字节数据处理比较多,例如:图片、音乐、电影、文字。
| - 要处理中文时,应该优先考虑字符流,如果没有中文问题,建议使用字节流。
2. 面向系统综合设计-图书馆管理系统或购物车
使用流与文件改造你的图书馆管理系统或购物车。
2.1 简述如何使用流与文件改造你的系统。文件中数据的格式如何?
- 使用Reader类子类BufferedReader来进行改造。
2.2 简述系统中文件读写部分使用了流与文件相关的什么接口与类?为什么要用这些接口与类?
- 使用的类:
| - File类
|- FileReader类
| - BufferedReader类 - 使用BufferedReader进行读取操作的时候,内部使用了缓冲区,对于图书馆这种大文件类型的系统,有缓冲区才可以保证查询资料的速度。
2.3 截图读写文件相关代码。关键行需要加注释。
选做: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 生成文件大小多少(使用右键文件属性查看)?分析该文件大小
4.1.3 如果调用PrintWriter的println方法,但在后面不close。文件大小是多少?为什么?
- 参考:本题具体要求见流与文件实验任务书-题目1-2.1
- 参考代码:
TextFileTest.java
- 因为
PrintWriter
内部使用了缓冲区,如果不通过close()
或者flush()
方法关闭或输出缓冲区中的内容的话,就默认为不输出内容了,所以如果不加close()
文件大小为0字节。
4.2. 缓冲流
4.2.1 使用PrintWriter往文件里写入1千万行(随便什么内容都行),然后对比使用BufferedReader与使用Scanner从该文件中读取数据的速度(只读取,不输出),使用哪种方法快?截取测试源代码,出现学号。请详细分析原因?提示:可以使用junit4对比运行时间
-
先创建一个一千万行内容的文件
-
使用Scanner从文件中读取数据
-
使用BufferedReader从文件中读取数据
-
由上面的比较可以很明显的看出,使用BufferedReader从文件中读取的速度要更快,原因是因为BufferedReader内部使用到了缓冲区,先将数据存放到缓冲区中再对底层数据进行操作,这样可以减少对底层数据操作的次数,由此运行时间也就大大减少了。
4.2.2 将PrintWriter换成BufferedWriter,观察写入文件的速度是否有提升。记录两者的运行时间。试分析原因。
-
参考:本题具体要求见流与文件实验任务书-题目1-2.2到2.3
-
参考代码:
BufferedReaderTest.java
-
使用
PrintWriter
的写入文件速度
-
使用
BufferedWriter
的写入文件速度
-
从上面两种子类写入文件的运行时间可以看出,使用
BufferedWriter
的写入文速度更快,因为BufferedWriter
内部中也是试用了缓冲区,更BufferedReader
相同,可以先将数据存放到缓冲区中,然后再一起对底层数据进行操作,相比PrintWriter
省去了许多与底层数据操作的次数,因此运行时间也就减少了,运行速度更快了。
4.4. Scanner基本概念组装对象
编写public static List<Student> readStudents(String fileName)
从fileName指定的文本文件中读取所有学生,并将其放入到一个List中。应该使用那些IO相关的类?说说你的选择理由。
-
实验文件:Students.txt
-
参考资料:TextFileTest目录下
TextFileTest.java
-
应当使用的IO相关类:
ArrayList
,Scanner
,FileReader
| - ArrayList:为了通过ArrayList
中提供的add()
和get(int)
方法,来把读取的学生信息封装后,放入list中,以及之后的读取验证。
| - Scanner:是为了通过Scanner的nextLine()
方法读取出每个学生(每行一个学生)的信息,然后调用String类中的split
方法提取出学生信息,然后再复原出学生全部信息,最后添加给list,以及通过Scanner提供的构造方法,结合传入的文件名fileName
读取文件信息。
| - FileReader:通过传入的文件名fileName
新建出一个Reader子类,读取数据。 -
Student类中的
readStudents(String fileName)throws FileNotFoundException
方法
-
main函数中调用
readStudents(String fileName)throws FileNotFoundException
方法,然后在输出list。
-
运行结果:
3.3 统计本周完成的代码量
需要将每周的代码统计情况融合到一张表中。
周次 | 总代码量 | 新增代码量 | 总文件数 | 新增文件数 |
---|---|---|---|---|
1 | 120 | 120 | 2 | 2 |
2 | 280 | 160 | 5 | 3 |
3 | 590 | 310 | 10 | 5 |
4 | 780 | 190 | 12 | 2 |
5 | 1290 | 510 | 17 | 5 |
6 | 1710 | 420 | 20 | 3 |
7 | 2513 | 803 | 24 | 4 |
8 | 2513 | 0 | 24 | 0 |
9 | 3014 | 501 | 27 | 3 |
10 | 3441 | 327 | 30 | 3 |
11 | 4121 | 680 | 37 | 7 |
12 | 4667 | 546 | 42 | 5 |
13 | 5214 | 547 | 48 | 6 |