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,ScannerFileReader
    | - 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
posted @ 2017-12-09 18:50  文不盲的苏些手丶  阅读(158)  评论(2编辑  收藏  举报