第一次实验

0. 字节流与二进制文件

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

  • 二进制文件与文本文件的区别
  • try...catch...finally注意事项

2.使用try..with...resouces关闭资源

3.使用DataInputStream与FileInputStream从student.data中读取学生信息并组装成对象

我的代码

  1. package homework;
  2. import java.io.DataInputStream;
  3. import java.io.DataOutputStream;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. class Student {
  9. private int id;
  10. private String name;
  11. private int age;
  12. private double grade;
  13. public Student(){
  14. }
  15. public Student(int id, String name, int age, double grade) {
  16. this.id = id;
  17. this.setName(name);
  18. this.setAge(age);
  19. this.setGrade(grade);
  20. }
  21. public int getId() {
  22. return id;
  23. }
  24. public void setId(int id) {
  25. this.id = id;
  26. }
  27. public String getName() {
  28. return name;
  29. }
  30. public void setName(String name) {
  31. if (name.length()>10){
  32. throw new IllegalArgumentException("name's length should <=10 "+name.length());
  33. }
  34. this.name = name;
  35. }
  36. public int getAge() {
  37. return age;
  38. }
  39. public void setAge(int age) {
  40. if (age<=0){
  41. throw new IllegalArgumentException("age should >0 "+age);
  42. }
  43. this.age = age;
  44. }
  45. public double getGrade() {
  46. return grade;
  47. }
  48. public void setGrade(double grade) {
  49. if (grade<0 || grade >100){
  50. throw new IllegalArgumentException("grade should be in [0,100] "+grade);
  51. }
  52. this.grade = grade;
  53. }
  54. @Override
  55. public String toString() {
  56. return "Student [id=" + id + ", name=" + name + ", age=" + age + ", grade=" + grade + "]";
  57. }
  58. }
  59. public class Main {
  60. public static void main(String[] args)
  61. {
  62. String fileName="d:\\student.data";
  63. try(DataOutputStream dos=new DataOutputStream(new FileOutputStream(fileName)))
  64. {
  65. Student[] stu=new Student[3];
  66. stu[0]=new Student(1,"zhangsan",19,65.0);
  67. stu[1]=new Student(2,"lisi",19,75.0);
  68. stu[2]=new Student(3,"wangwu",20,85.0);
  69. for(Student stu1:stu) {
  70. dos.writeInt(stu1.getId());
  71. dos.writeUTF(stu1.getName());
  72. dos.writeInt(stu1.getAge());
  73. dos.writeDouble(stu1.getGrade());
  74. }
  75. } catch (FileNotFoundException e) {
  76. // TODO Auto-generated catch block
  77. e.printStackTrace();
  78. } catch (IOException e) {
  79. // TODO Auto-generated catch block
  80. e.printStackTrace();
  81. }
  82. try(DataInputStream dis=new DataInputStream(new FileInputStream(fileName)))
  83. {
  84. while(dis!=null) {
  85. int id=dis.readInt();
  86. String name=dis.readUTF();
  87. int age=dis.readInt();
  88. double grade=dis.readDouble();
  89. Student stu=new Student(id,name,age,grade);
  90. System.out.println(stu);
  91. }
  92. } catch (FileNotFoundException e) {
  93. // TODO Auto-generated catch block
  94. e.printStackTrace();
  95. } catch (IOException e) {
  96. // TODO Auto-generated catch block
  97. e.printStackTrace();
  98. }
  99. }
  100. }

我的总结

  1. 二进制文件与文本文件的区别:
  2. 广义上的二进制文件包括文本文件,这里讨论的是狭义上的二进制文件与文本文件的比较:
  3. 1. 能存储的数据类型不同:文本文件只能存储char型字符变量。二进制文件可以存储char/int/short/long/float/……各种变量值。
  4. 2. 每条数据的长度不同:文本文件每条数据通常是固定长度的。以ASCII为例,每条数据(每个字符)都是1个字节。二进制文件每条数据不固定。如short占两个字节,int占四个字节,float8个字节。
  5. 3. 读取的软件不同:文本文件编辑器就可以读写。比如记事本、NotePad++、Vim等。二进制文件需要特别的解码器。比如bmp文件需要图像查看器,rmvb需要播放器。
  6. 4. 操作系统对换行符('\n')的处理不同(不重要):文本文件,操作系统会对'\n'进行一些隐式变换,因此文本文件直接跨平台使用会出问题。在Windows下,写入'\n'时,操作系统会隐式的将'\n'转换为"\r\n",再写入到文件中;读的时候,会把“\r\n”隐式转化为'\n',再读到变量中。在Linux下,写入'\n'时,操作系统不做隐式变换。

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

任务:

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

  • 中文乱码问题(FileReader使用系统默认编码方式读取文件,会产生乱码,可使用InputStreamReader解决)
  • String的split方法使用\s+可以使用多个空格作为分隔符。
  • 进阶:修改Students.txt文件,在正确的数据行中间增加一些错误行(如,每行只有3个数据,或者应该是数字的地方放入其他字符),修改自己的程序,让起可以处理出错的行(报错但可以继续运行)。

2.编写public static ListreadStudents(String fileName);从fileName指定的文本文件中读取所有学生,并将其放入到一个List中

3.使用PrintWriter将Student对象写入文本文件,基础代码见后。注意:缓冲区问题。

4.使用ObjectInputStream/ObjectOutputStream读写学生对象。

我的代码

  1. package homework;
  2. import java.io.BufferedReader;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. public class Main {
  7. public static void main(String[] args) throws IOException
  8. {
  9. String FileName="D:\\TSBrowserDownloads\\Students.txt";
  10. BufferedReader br = null;
  11. try {
  12. br = new BufferedReader(new InputStreamReader(new FileInputStream(FileName),"UTF-8"));
  13. String line = null;
  14. while((line=br.readLine())!=null)
  15. System.out.println(line);
  16. } finally{
  17. if (br!=null){
  18. br.close();
  19. }
  20. }
  21. }
  22. }

我的总结

  1. 1.在编译过程中总是会出现很多错误,首先是头文件的问题,还有就是一些错误的提示,不知道怎么去改正,这方面学习的不好,通过同学才明白。
  2. 2.还有就是做题中会用到的一些知识点。

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进行标注。

我的代码

  1. package homework;
  2. public class test {
  3. @Test
  4. public void test() {
  5. String FILENAME = "test.txt";
  6. long begin = System.currentTimeMillis();
  7. Scanner scanner=null;
  8. try {
  9. scanner = new Scanner(new File(FILENAME));
  10. while(scanner.hasNextLine()){//只是读出每一行,不做任何处理
  11. scanner.nextLine();
  12. }
  13. } catch (FileNotFoundException e) {
  14. e.printStackTrace();
  15. }finally{
  16. scanner.close();
  17. }
  18. long end = System.currentTimeMillis();
  19. System.out.println("last "+(end-begin));
  20. System.out.println("read using Scanner done");
  21. }
  22. @Test
  23. public void Bufftest() {
  24. String FILENAME = "test.txt";
  25. long begin = System.currentTimeMillis();
  26. BufferedReader br = null;
  27. try {
  28. br = new BufferedReader(new FileReader(new File(FILENAME)));
  29. while(br.readLine()!=null){};//只是读出,不进行任何处理
  30. } catch (FileNotFoundException e) {
  31. e.printStackTrace();
  32. } catch (IOException e) {
  33. e.printStackTrace();
  34. }finally{
  35. try {
  36. br.close();
  37. } catch (IOException e) {
  38. e.printStackTrace(); }
  39. }
  40. long end = System.currentTimeMillis();
  41. System.out.println("last "+(end-begin));
  42. System.out.println("read using BufferedReader done");
  43. }
  44. }

我的总结

  1. 总体来说使用Scanner读取文本文件要比用BufferedReader更容易,而且,Scanner具有比BufferedReader更多的方法。

思考题:

为什么以下代码生成的文件大小是0,而只有当count=16384(两倍的默认缓冲区大小)才可以真正写入到文件?

String fileName = "d:/Test.data";

int count = 16383;

PrintWriter pw = null;

try {

pw = new PrintWriter(fileName);

  1. for (int i = 0; i < count; i++) {
  2. pw.print(1);
  3. }

} catch (FileNotFoundException e) {

e.printStackTrace();

}finally{

//pw.close();

}

答:

第二次实验

3. 字节流之对象流

结合使用ObjectOutputStream、ObjectInputStream与FileInputStream、FileOuputStream实现对Student对象的读写。

编写如下两个方法:

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

    进阶:

    使用wxMEdit打开ObjectOutputStream所生成的文件格式,尝试修改文件,并通过代码读取文件进行验证。

我的代码

  1. public static void writeStudent(List<Student> stuList)
  2. 2 {
  3. 3 String fileName="D:\\Student.dat";
  4. 4 try ( FileOutputStream fos=new FileOutputStream(fileName);
  5. 5 ObjectOutputStream ois=new ObjectOutputStream(fos))
  6. 6 {
  7. 7 ois.writeObject(stuList);
  8. 8
  9. 9 }
  10. 10 catch (FileNotFoundException e) {
  11. 11 // TODO Auto-generated catch block
  12. 12 e.printStackTrace();
  13. 13 } catch (IOException e1) {
  14. 14 // TODO Auto-generated catch block
  15. 15 e1.printStackTrace();
  16. 16 }
  17. 17 }
  18. 18 public static List<Student> readStudents(String fileName)
  19. 19 {
  20. 20 List<Student> stuList=new ArrayList<>();
  21. 21 try ( FileInputStream fis=new FileInputStream(fileName);
  22. 22 ObjectInputStream ois=new ObjectInputStream(fis))
  23. 23 {
  24. 24 stuList=(List<Student>)ois.readObject();
  25. 25 }
  26. 26 catch (FileNotFoundException e) {
  27. 27 // TODO Auto-generated catch block
  28. 28 e.printStackTrace();
  29. 29 } catch (IOException e1) {
  30. 30 // TODO Auto-generated catch block
  31. 31 e1.printStackTrace();
  32. 32 } catch (ClassNotFoundException e) {
  33. 33 // TODO Auto-generated catch block
  34. 34 e.printStackTrace();
  35. 35 }
  36. 36 return stuList;
  37. 37 }

我的总结

  1. 1.ObjectOutputStream的使用
  2. - ObjectOutputStream是一个高级流, Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。
  3. 2.ObjectInputStream的使用
  4. - ObjectInputStream也是一个高级流,对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
  5. 3.ObjectOutputStream ObjectInputStream 分别与 FileOutputStream FileInputStream 一起使用时,可以为应用程序提供对对象图形的持久存储。ObjectOutputStream用于序列化对象,ObjectInputStream 用于恢复那些以前序列化的对象(反序列化)。其他用途包括使用套接字流在主机之间传递对象,或者用于编组和解组远程通信系统中的实参和形参。

4. 选做:RandomAccessFile

像操作数组一样操作文件内容。

将以上的对大量Student对象的读写使用RandomAceessFile。

特别考核:你觉得使用RandomAccessFile读写文件与使用字节流、字符流、缓冲流相比较各有何优缺点。

我的代码


我的总结


5. 文件操作

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

编写public static void findFile(Path dir,String fileName)方法.

以dir指定的路径为根目录,在其目录与子目录下查找所有和filename

相同的文件名,一旦找到就马上输出到控制台。

提示:

1.使用递归或队列。建议使用队列完成。

2.使用图形界面:

  • GUI下可使用JFileChooser控件实现选取目录。控制台下手动指定目录名。

    参考代码(参考代码 目录中):

  • 一个简单的包括菜单的GUI小程序.rar(包含JFileChooser的用法)

  • FindDirectories.java (用于查找文件)

    进阶(选做):

    自己编写的文件搜索方法基本上有很大缺陷,如不能正确处理符号链接。

    考核点:查询资料,尝试使用Files.walkFileTree方法进行文件搜索。

我的代码

  1. if (args.length == 0) args = new String[] { ".." };
  2. try
  3. {
  4. File pathName = new File(args[0]);
  5. String[] fileNames = pathName.list();
  6. // enumerate all files in the directory
  7. for (int i = 0; i < fileNames.length; i++)
  8. {
  9. File f = new File(pathName.getPath(), fileNames[i]);
  10. // if the file is again a directory, call the main method recursively if (f.isDirectory())
  11. {
  12. if(f.getName().contains(fileName)) {
  13. System.out.println(f.getCanonicalPath());
  14. main(new String[] { f.getPath() });
  15. }
  16. }
  17. }
  18. }
  19. catch (IOException e)
  20. {
  21. e.printStackTrace();
  22. }

我的总结

  1. 1Files.walkFileTree的原理介绍
  2. 原型:static Path Files.walkFileTree(Path start, FileVisitor<? super Path> visitor);
  3. ii. 表示从start代表的节点开始遍历文件系统;
  4. iii. 其中visitor是遍历过程中的行为控制器;
  5. 4) 遍历行为控制器——FileVisitor
  6. i. 它是一个接口,里面定义了4个方法用来指定当你访问一个节点之前、之中、之后、失败时应该采取什么行动;

6. 正则表达式

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

2.修改HrefMatch.java

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

    1、2为一考核点。

我的代码

  1. test
  2. {
  3. // get URL string from command line or use default
  4. String urlString;
  5. if (args.length > 0) urlString = args[0];
  6. else urlString = "http://cec.jmu.edu.cn";
  7. // open reader for URL
  8. InputStreamReader in = new InputStreamReader(new URL(urlString).openStream());
  9. //InputStreamReader in = new InputStreamReader(new FileInputStream("集美大学-计算机工程学院.htm"));
  10. // read contents into string builder
  11. StringBuilder input = new StringBuilder();
  12. int ch;
  13. while ((ch = in.read()) != -1)
  14. input.append((char) ch);
  15. // search for all occurrences of pattern
  16. String patternString = "<a\\s+href\\s*=\\s*(\"[^\"]*\"|[^\\s>]*)\\s*>";
  17. String patternImgString = "[+-]?[0-9]+";
  18. //String patternString = "[\u4e00-\u9fa5]"; //匹配文档中的所有中文
  19. Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
  20. Matcher matcher = pattern.matcher(input);
  21. while (matcher.find())
  22. {
  23. int start = matcher.start();
  24. int end = matcher.end();
  25. String match = input.substring(start, end);
  26. System.out.println(match);
  27. }
  28. }
  29. catch (IOException e)
  30. {
  31. e.printStackTrace();
  32. }
  33. catch (PatternSyntaxException e)
  34. {
  35. e.printStackTrace();
  36. }

我的总结

  1. 正则表达式是什么:正则表达式(regular expression)是一个描述字符模式的对象。JavaScriptRegExp类表示正则表达式,StringRegExp都定义了方法。

Java第09次实验(流与文件)的更多相关文章

  1. JAVA第09次实验(IO流)

    JAVA第09次实验(IO流) 0.字节流与二进制文件 我的代码 import java.io.DataInputStream; import java.io.DataOutputStream; im ...

  2. Java第09次实验(IO流)

    参考资料 本次作业参考文件 正则表达式参考资料 第1次实验 0. 验证 使用FileOutputStream写字节.(二进制文件与文本文件.try...catch...finally注意事项) 使用D ...

  3. JAVA中的I/O流以及文件操作

    一 JAVA语言中主要通过流来完成IO操作. 流:计算机的输入输出之间流动的数据序列,也是类的对象.java中的流方式就像是建立在数据交换源和目的之间的一条通信路径. 数据源:计算机中的数据源是指可以 ...

  4. java使用字节流和字符流实现文件复制

    大家在Java开发中都会遇到文件复制的文件,众所周知,需要通过文件输入输出流实现. 那究竟该怎么做那,话不多说,直接上代码: 一,使用字节流复制文件 public class FileByteCopy ...

  5. Java中字节流和字符流复制文件

    字节流和字符流复制文件的过程: 1.建立两个流对象 绑定数据源和目的地 2.遍历出需复制的文件写入复制过后的新文件中(只不过是遍历的时候是区分字节和字符的) 3.访问结束后关闭资源 字节流复制文件: ...

  6. Java基础教程:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  7. Java第09次实验(IO流)-实验报告

    0. 字节流与二进制文件 使用DataOutputStream与FileOutputStream将Student对象写入二进制文件student.data 二进制文件与文本文件的区别 try...ca ...

  8. Java第09次实验(IO流)--实验报告

    0.字节流与二进制文件 我的代码 用DataOutputStream和FileOutputStream将Student对象写入二进制文件student.data package test; impor ...

  9. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

随机推荐

  1. springboot2整合zookeeper集成curator

    步骤: 1- pom.xml <dependency> <groupId>org.apache.curator</groupId> <artifactId&g ...

  2. 利用Mocking Framework 单元测试Entity Framework

    一.前言 在实际编写程序时,往往需要与数据库打交道,在单元测试中直接使用数据库又显得太重,如果可以方便的编写一些测试数据,这样更易于检测功能.如何模拟数据库行为便是本篇的主题.微软有教程说明Moq E ...

  3. iview表单验证之正则验证、函数验证

    iview表单验证之正则 正则验证: 代码: loginRules: { stringLength: [ { required: true, message: '该字段不能为空', trigger: ...

  4. 直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...

  5. vue 内存数组变化监听

    watch: { carts: { handler(val, oldVal) { subtotal(this.carts); console.log(this.carts) }, deep: true ...

  6. zabbix 邮件报警事件:Zabbix discoverer processes more than 75% busy

    Problem has been resolved at :: on Problem name: Zabbix discoverer processes more than % busy Host: ...

  7. 会了docker你又多了一个谈资(下)

    上篇文章介绍了docker 基本使用及安装([跳转☞会了docker你又多了一个谈资(上)],这篇重点说明下docker使用技巧. 问题1怎么用docker搭建多台服务器? 只需要 docker ru ...

  8. Kendo UI for jQuery使用教程:初始化jQuery插件

    [Kendo UI for jQuery最新试用版下载] Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support ...

  9. Java使用freemarker导出word文档

    通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...

  10. Avro从入门到入土

    avro官网 1.Avro历史 Avro是Hadoop的一个数据序列化系统,由Hadoop的创始人Doug Cutting(也是Lucene,Nutch等项目的创始人)开发,设计用于支持大批量数据交换 ...