流、文件与正则表达式

第1次实验

0. 字节流与二进制文件

使用DataOutputStream与FileOutputStream将Student对象写入二进制文件student.data

  • 二进制文件与文本文件的区别
  • try...catch...finally注意事项
  • 使用try..with...resouces关闭资源
    使用DataInputStream与FileInputStream从student.data中读取学生信息并组装成对象

我的代码

我的总结

1.二进制文件与文本文件的区别
二进制文件可以存储类似int/double/char的基本数据类型,但是文本文件只能存储char型变量,所以文本文件在读取或存储过程中常需要用到类型转换,例如将char型的转换成int的parseInt
2.try...catch...finally注意事项
catch多个异常时要注意异常写的先后顺序,越大的异常要放越后面
3.使用try..with...resouces关闭资源
可以直接在try(........)的括号中定义最后要关闭的资源,在运行结束后会自动关闭,不需要在finally中关闭资源

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

任务:

使用BufferedReader从编码为UTF-8的文本文件中读出学生信息,并组装成对象然后输出。

  • 中文乱码问题(FileReader使用系统默认编码方式读取文件,会产生乱码,可使用InputStreamReader解决)
  • String的split方法使用\s+可以使用多个空格作为分隔符。
  • 进阶:修改Students.txt文件,在正确的数据行中间增加一些错误行(如,每行只有3个数据,或者应该是数字的地方放入其他字符),修改自己的程序,让起可以处理出错的行(报错但可以继续运行)。
    编写public static ListreadStudents(String fileName);从fileName指定的文本文件中读取所有学生,并将其放入到一个List中
    使用PrintWriter将Student对象写入文本文件,基础代码见后。注意:缓冲区问题。
    使用ObjectInputStream/ObjectOutputStream读写学生对象。

我的代码

任务一

任务二

任务三

任务四

我的总结

文本的默认是GBK编码,如果直接打开就会造成中文乱码,所以通过InputStreamReader isr=new InputStreamReader(fis, "UTF-8")将编码模式改为UTF-8
任务3中一开始PrintWriter会直接覆盖原文件,所以在构造FileOutputStream时多传一个true,FileOutputStream fos=new FileOutputStream(fileName,true);

2. 缓冲流(结合使用JUint进行测试)

使用PrintWriter往文件里写入1千万行随机整数,范围在[0,10]。随机数种子设置为100.
然后从文件将每行读取出来转换成整数后相加。然后依次输出“个数 和 平均值(保留5位小数)”。
对比使用BufferedReader与使用Scanner从该文件中读取数据(只读取,不输出),使用哪种方法快?
  • 使用junit对比BufferedReaderScanner读文件的效率
  • 格式化输出:System.out.format。
  • 要使用Scanner的hasNextXXX方法来判断是否到文件尾,否则会抛异常。
  • Scanner的asNextXXX方法应与相对应的nextXXX方法配合使用,否则容易出。
  • 请删除fail("Not yet implemented");;并且在需要测试的方法上使用@Test进行标注。

我的代码


测试

我的总结

一开始,Random类生成随机种子的时候,直接使用random.setSeed(100).nextInt(10)导致生成的随机数都是同一个,后面才发现原来要分开的,才能生成随机种子,例如: Random random=new Random();random.setSeed(100);int r=random.nextInt(10);

第2次实验

3. 字节流之对象流

结合使用ObjectOutputStream、ObjectInputStream与FileInputStream、FileOuputStream实现对Student对象的读写。
编写如下两个方法:

  • public static void writeStudent(List stuList)
  • public static List readStudents(String fileName)

我的代码

我的总结

使用对象流时,写入的是一个对象,可以直接读出一个集合或数组,不用像用BufferedReader时一行一个Student对象地读取

5. 文件操作

编写一个程序,可以根据指定目录和文件名,搜索该目录及子目录下的所有文件,如果没有找到指定文件名,则显示无匹配,否则将所有找到的文件名与文件夹名显示出来。
编写public static void findFile(Path dir,String fileName)方法.
以dir指定的路径为根目录,在其目录与子目录下查找所有和filename
相同的文件名,一旦找到就马上输出到控制台。

我的代码

我的总结

Path是File类的升级版,可以代表文件或目录,paths是一个工具,帮助获取Path对象,通过Paths就不需要使用new来创建Path对象了

6. 正则表达式

如何判断一个给定的字符串是否是10进制数字格式?尝试编程进行验证。
修改HrefMatch.java

  • 尝试匹配网页中的数字字符串
  • 尝试匹配网页中的图片字符串

我的代码

任务一

任务二

我的总结

正则表达式主要是知道相应的规则和正则表达式语法,就可以在字符串中,或者图片中抓取到相应的内容  
posted @ 2019-11-26 23:03  Hyjjing  阅读(98)  评论(0编辑  收藏  举报