流、文件与正则表达式
第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
对比BufferedReader
与Scanner
读文件的效率 - 格式化输出: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
- 尝试匹配网页中的数字字符串
- 尝试匹配网页中的图片字符串
我的代码
任务一
任务二
我的总结
正则表达式主要是知道相应的规则和正则表达式语法,就可以在字符串中,或者图片中抓取到相应的内容