zoukankan      html  css  js  c++  java
  • 第12周-流与文件

    1. 本周学习总结

    1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容。

    • 字符流-文本输入与输出
      一定要在finally块中关闭资源
      字符编码转化会自动进行
      底层依然可以使用字节流
    • 缓冲区进行写操作
      缓冲区未满出现异常
      数据丢失-没有真正实现写出

    2. 书面作业

    将Student对象(属性:int id, String name,int age,double grade)写入文件student.data、从文件读出显示。

    1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读)

    1.1 生成的三个学生对象,使用PrintWriter的println方法写入student.txt,每行一个学生,学生的每个属性之间用|作为分隔。使用Scanner或者BufferedReader将student.txt的数据读出。(截图关键代码,出现学号)


    1.2 生成文件大小多少?分析该文件大小

    答: 生成文件大小为51字节。


    • 分析:
      第一行:成员数占1字节+行末尾(' ')2字节=3字节
      第二行:id占1字节+name占4字节+age占2字节+grade占4字节+分隔符3字节+行末尾占2字节=16字节
      后两行同理,总共51字节。

    1.3 如果调用PrintWriter的println方法,但在后面不close。文件大小是多少?为什么?

    答: 文件大小是0字节。

    • 原因:
      close方法:关闭此流并释放与该流关联的所有系统资源。如果不释放,则有限的系统资源将被耗尽。
      所以不关闭(close)流,最后的字节不会被传送出去,造成了数据丢失;文件大小为0字节。

    2. 缓冲流

    2.1 使用PrintWriter往文件里写入1千万行(随便什么内容都行),然后对比使用BufferedReader与使用Scanner从该文件中读取数据的速度(只读取,不输出),使用哪种方法快?请详细分析原因?提示:可以使用junit4对比运行时间

    答: BufferedReader读取速度快。

    • 原因:
      BufferedReader有缓冲区,不用按照实际IO次数读取,先放到缓冲区再一次性读取;
      而Scanner可能发生阻塞,等待信息进入,效率比较低。

    2.2 将PrintWriter换成BufferedWriter,观察写入文件的速度是否有提升。记录两者的运行时间。试分析原因

    答: 写入文件速度有提升。

    • 原因:
      PrintWriter对整个文件进行缓冲;
      BufferedWriter将文本写入字符输出流,对各个字符进行缓冲;
      相对来说,BufferedWriter的缓冲效率比较好,因此速度提升。

    3. 字符编码

    3.1 现有EncodeTest.txt 文件,该文件使用UTF-8编码。使用FileReader与BufferedReader将EncodeTest.txt的文本读入并输出。是否有乱码?为什么会有乱码?如何解决?(截图关键代码,出现学号)

    答: 有乱码。使用UTF-8编码的文件只能用同一种编码读入并输出,而FileReader按系统默认的编码来读取文件内容。


    • 运行结果:

    • 解决乱码的代码


    3.2 编写一个方法convertGBK2UTF8(String src, String dst),可以将以GBK编码的源文件src转换成以UTF8编码的目的文件dst。

    答:

    • 运行结果:

    4. 字节流、二进制文件:DataInputStream, DataOutputStream、ObjectInputStream

    4.1 参考DataStream目录相关代码,尝试将三个学生对象的数据写入文件,然后从文件读出并显示。(截图关键代码,出现学号)

    • 运行结果:

    4.2 生成的文件有多大?分析该文件大小?将该文件大小和题目1生成的文件对比是大了还是小了,为什么?

    答:
    (1)生成的文件72字节。
    (2)分析:(id-int型占4字节) + name(两个汉字)占4字节 + (age-int型占4字节) + (grade-double型占8个字节) + 分隔符共占3个字节 + 换行符占1个字节=24个字节;三行共占72字节。
    (3)对比结果:该文件更大。
    (4)原因:题目1用字符串处理文件大小;而本题以具体类型处理文件大小。

    4.3 使用wxMEdit的16进制模式(或者其他文本编辑器的16进制模式)打开student.data,分析数据在文件中是如何存储的。

    答: 数据以数据类型的大小进行存储:
    (1)00 00 00 01 ->id ->int型
    (2)00 06 E5 BC A0 A4 B8 89 ->name
    (3)00 00 00 13 ->age ->int型
    (4)40 50 40 00 00 00 00 00 ->grade ->double型

    结论: 之前的分析似乎是错的,name占了8个字节?!!

    4.4 使用ObjectInputStream(读), ObjectOutputStream(写)读写学生。(截图关键代码,出现学号) //参考ObjectStreamTest目录

    • 运行结果:

    5. 基本概念

    编写public static List<Student> readStudents(String fileName);从fileName指定的文本文件中读取所有学生,并将其放入到一个List中。应该使用那些IO相关的类?说说你的选择理由。

    答:
    (1)java.io.FileInputStream——字节流:读取文件
    (2)java.io.InputStreamReader——字符流:按照指定编码在字节流与字符流间转换(转换为UTF-8编码格式)
    (3)java.io.BufferedReader——缓冲流:提高读写效率

    6. 选做:RandomAccessFile

    6.1 使用RandomAccessFile实现题目1.1。(截图关键代码,出现学号)

    6.2 分析文件大小

    7. 文件操作

    —编写一个程序,可以根据指定目录和文件名,搜索该目录及子目录下的所有文件,如果没有找到指定文件名,则显示无匹配,否则将所有找到的文件名与文件夹名显示出来。

    7.1 编写public static void findFile(String path,String filename)函数,以path指定的路径为根目录,在其目录与子目录下查找所有和filename相同的文件名,一旦找到就马上输出到控制台。(截图关键代码,出现学号)

    7.2 加分点:使用队列、使用图形界面、使用Java NIO.2完成(任选1)

    7.3 选做:实现删掉指定目录及其子目录下的所有空文件夹。

    -参考代码:FindDirectories.java
    参考:本题具体要求见流与文件实验任务书-题目2

    8. 正则表达式

    8.1 如何判断一个给定的字符串是否是10进制数字格式?尝试编程进行验证。(截图关键代码,出现学号)

    • 运行结果:

    8.2 选做:修改HrefMatch.java,尝试匹配网页中的数字字符串、匹配网页中的图片字符串。

    -参考:本题具体要求见流与文件实验任务书-题目3

    8.3 选做(较难):进一步改造上面的程序,获得图片的链接,如IMG src="images/mail1.gif",然后经过处理,生成该图片的实际链接地址http://cec.jmu.edu.com/images/mail1.gif。最后将生成的若干地址,放入一个队列。编写方法,可以依照该队列的所有图片地址,一次将图片下载下来。

    3. 码云及PTA

    3.1. 码云代码提交记录

    ——在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图

    3.2 PTA以前未完成的题目

    ——截图

  • 相关阅读:
    Study Plan The TwentySecond Day
    Study Plan The Nineteenth Day
    Study Plan The TwentySeventh Day
    Study Plan The Twentieth Day
    Study Plan The TwentyFirst Day
    python实现进程的三种方式及其区别
    yum makecache
    JSONPath 表达式的使用
    oracle执行cmd的实现方法
    php daodb插入、更新与删除数据
  • 原文地址:https://www.cnblogs.com/whting/p/6833246.html
Copyright © 2011-2022 走看看