1. 本周学习总结

2. 书面作业

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

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

参考代码:TextFileTest.java

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

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

  1. //201521123025
  2. import java.io.*;
  3. import java.util.*;
  4. class Student {
  5. private int id;
  6. private String name;
  7. private int age;
  8. private double grade;
  9. public Student(){
  10. }
  11. public Student(int id, String name, int age, double grade) {
  12. this.id = id;
  13. this.setName(name);
  14. this.setAge(age);
  15. this.setGrade(grade);
  16. }
  17. public int getId() {
  18. return id;
  19. }
  20. public void setId(int id) {
  21. this.id = id;
  22. }
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. if (name.length()>10){
  28. throw new IllegalArgumentException("name's length should <=10 "+name.length());
  29. }
  30. this.name = name;
  31. }
  32. public int getAge() {
  33. return age;
  34. }
  35. public void setAge(int age) {
  36. if (age<=0){
  37. throw new IllegalArgumentException("age should >0 "+age);
  38. }
  39. this.age = age;
  40. }
  41. public double getGrade() {
  42. return grade;
  43. }
  44. public void setGrade(double grade) {
  45. if (grade<0 || grade >100){
  46. throw new IllegalArgumentException("grade should be in [0,100] "+grade);
  47. }
  48. this.grade = grade;
  49. }
  50. @Override
  51. public String toString() {
  52. return "Student [id=" + id + ", name=" + name + ", age=" + age + ", grade=" + grade + "]";
  53. }
  54. public void writeData(PrintWriter out) {
  55. out.println(id+"|"+name+"|"+age+"|"+grade);
  56. }
  57. public void readData(Scanner in)
  58. {
  59. String line = in.nextLine();
  60. String[] tokens = line.split("\\|");
  61. id = Integer.parseInt(tokens[0]);
  62. name=tokens[1];
  63. age=Integer.parseInt(tokens[2]);
  64. grade=Double.parseDouble(tokens[3]);
  65. }
  66. }
  67. public class Test{
  68. public static void main(String[] args){
  69. Student[] stu=new Student[3];
  70. stu[0]=new Student(1,"张三",19,65);
  71. stu[1]=new Student(2,"李四 ",19,75);
  72. stu[2]=new Student(25,"林振斌",20,85);
  73. try{
  74. PrintWriter out=new PrintWriter("d:/student.txt");
  75. Writedata(stu,out);
  76. out.close();
  77. Scanner in=new Scanner(new FileReader("d:/student.txt"));
  78. Student[] newstu=readData(in);
  79. in.close();
  80. for (Student e : newstu)
  81. System.out.println(e);
  82. }catch (IOException exception)
  83. {
  84. exception.printStackTrace();
  85. }
  86. }
  87. private static Student[] readData(Scanner in) {
  88. int n = in.nextInt();
  89. in.nextLine(); // consume newline
  90. Student[] stus = new Student[n];
  91. for (int i = 0; i < n; i++)
  92. {
  93. stus[i] = new Student();
  94. stus[i].readData(in);
  95. }
  96. return stus;
  97. }
  98. private static void Writedata(Student[] stu, PrintWriter out)throws IOException {
  99. out.println(stu.length);
  100. for (Student e : stu)
  101. e.writeData(out);
  102. }
  103. }



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

id,age:每个数字占1byte

name:每个汉字占2byte

grade:每个grade占4字节

"|":每个占1byte

换行符:占2byte

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



0字节,因为数据写到缓冲区上,原来有close()方法自动调用flush()来刷新,但是现在没有close()了,所以数据在缓冲区上直接丢失了。

2. 缓冲流

  • 参考:本题具体要求见流与文件实验任务书-题目1-2.2到2.3
  • 参考代码:BufferedReaderTest.java
  • JUnit4常用注解
  • JUnit4学习

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

用BufferedReader更快,因为使用缓冲区可以减少I/O次数,不用每次读写而是等缓冲区满了才进行一次读写。Scanner每次读写都要进行一次物理上的I/O操作,所以费时更多。

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

使用BufferedWriter后有提升,因为BufferedWriter有使用缓冲。

3. 字符编码

  • 参考:InputStreamReaderTest.java与教学PPT

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



有乱码,因为FileReader并没有实现父类中带字符集参数的构造函数,只能按系统默认的字符集来解码。

  • 修改:

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

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

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

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







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

72个字节。一个int=4Byte,一个double=8Byte,一个汉字=2Byte,标识符有两个字节。一个学生24个字节,一共三名学生,72字节。

将该文件大小和题目1生成的文件对比是大了。因为使用UTF-8编码存储文件.

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

行数 分析

000行 31=>1,7C=>分隔符,D5 C5 C8 FD=>张三,31 39=>19,36 35 2E 30=>65.0,0D 0A=>换行

010行 32=>2, 7C=>分隔符,C0 EE CB C4 20=>李四,31 39=>19,37 35 2E 30=>75.0,0D 0A=>换行

020行 33=>3, 7C=>分隔符,CD F5 CE E5=>王五,32 30=>20,38 35 2E 30=>85.0,0D 0A=>换行

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

  1. ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("student.txt"));
  2. out.wirteObject(student);
  3. out.close();
  4. objectInputStream in = new objectInputStream(new FileOutputStream("student.txt"));
  5. Student[] new Student = (Student[])in.readOject();
  6. in.close;
  7. for(Student e :new Student)
  8. System.out.println(e);

Q5. Scanner基本概念组装对象

实验文件:Students.txt

参考:TextFileTest目录下TextFileTest.java

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

FileInputStream:从文件中读,BufferedInputStream:以缓冲方式从文件流中读,FileInputStream:因为要读UTF-8格式的文件

Q7. 文件操作

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

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

  1. public static void findFile(String path,String filename){
  2. File pathName = new File(path);
  3. String[] fileName = pathName.list();
  4. for (String string : fileName) {
  5. File file1= new File(pathName.getAbsolutePath(),string);
  6. if (string.equals(filename)) {
  7. System.out.println(f.getAbsolutePath());
  8. }
  9. if (file1.isDirectory()) {
  10. findFile(file1.getAbsolutePath(),filename);
  11. }
  12. }

Q8. 正则表达式

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

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

  1. public static boolean isnum(string str){
  2. String patternString="-?\\d+";
  3. return Pattern.matches(patternString, str);
  4. }

3. 码云及PTA

201521123025《java程序设计》第12周学习总结的更多相关文章

  1. 201521123025<java程序设计>第五周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...

  2. 201521123025<<java程序设计>>第4周学习总结

    Q1. 本周学习总结 Q2.书面作业 1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) 2.面向对象设计(大作业1,非常重要) 2.1 将在网上 ...

  3. 201521123025 <<java程序设计>>第3周学习总结

    1. 本周学习总结 2. 书面作业 Q1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; ...

  4. 201521123025<<java程序设计>>第9周学习总结

    1. 本周学习总结 2.书面作业 Q1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 经常出现Array ...

  5. 2018面向对象程序设计(Java)第12周学习指导及要求

    2018面向对象程序设计(Java)第12周学习指导及要求 (2018.11.15-2018.11.18)   学习目标 (1) 掌握Java GUI中框架创建及属性设置中常用类的API: (2) 掌 ...

  6. 面向对象程序设计(JAVA) 第12周学习指导及要求

    2019面向对象程序设计(Java)第12周学习指导及要求 (2019.11.15-2019.11.18)   学习目标 (1) 掌握Vetor.Stack.Hashtable三个类的用途及常用API ...

  7. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  8. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  9. 20175209 《Java程序设计》第九周学习总结

    20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...

  10. 20175221 2018-2019-2 《Java程序设计》第一周学习总结

    20175221 2018-2019-2 <Java程序设计>第一周学习总结 教材学习内容总结 本周通过观看书本配套视频,学到了如解释器,编译器等一些简单概念. 还懂得了java的一些简单 ...

随机推荐

  1. ORACLE索引监控的简单使用

    --ORACLE索引监控的简单使用-------------------------2013/11/20 说明:     应用程序在开发时,可能会建立众多索引,但是这些索引的使用到底怎么样,是否有些索 ...

  2. umask的作用

    --umask的作用---------------2013/11/15 umask的作用就是当用户创建一个文件时,设置默认的目录和文件权限. 创建非目录文件时,用666减umask值(目录文件用777 ...

  3. java代码_按要求输出相应沙漏

    package Callatz;/* 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印******* *****   ***    *   ...

  4. 使用TensorFlow创建第变量定义和运行方式

    import tensorflow as tf# 熟悉tensorflow的变量定义和运行方式v1 = tf.Variable(2) #定义变量并给变量赋值v2 = tf.Variable(48) c ...

  5. MySQL (九)

    1 代码执行结构 代码执行结构有三种:顺序结构.分支结构和循环结构. 1.1 分支结构 分支结构:实现准备多个代码块,按照条件选择性执行某段代码. 在MySQL中只有if分支. 基本语法 if 条件判 ...

  6. Myeclipse详细使用教程

    Myeclipse详细使用教程.. /*+Shift+Enter(生成多行注释) /**+Shift+Enter(生成文档注释)-----------------问题:在编辑jsp的时候,如果光标移动 ...

  7. 学问Chat UI(3)

    前言 上文学问Chat UI(2)分析了消息适配器的实现; 本文主要学习下插件功能如何实现的.并以图片插件功能作为例子详细说明,分析从具体代码入手; 概要 分析策略说明 "+"功能 ...

  8. Java中的注释-快捷键

    Eclipse中的快捷键  单行注释   Ctrl+/ 多行注释    Ctrl+Shift+/  文档注释    Shift +Alt+j /** * @author Lenovo * 文档注释 * ...

  9. 知名渗透测试利器分享 - Appscan下载

    安全测试应该是测试中非常重要的一部分,但他常常最容易被忽视掉. 尽管国内经常出现各种安全事件,但没有真正的引起人们的注意.不管是开发还是测试都不太关注产品的安全.当然,这也不能怪我们苦B的" ...

  10. 关于JDBC导入mysql的jar驱动的头痛

    今天上午想写个小程序,需要调用数据库,查了书和各个博客. 最后卡在导入mysql驱动上了,花了1个多小时才让程序连上数据库. 这里有个小误区,你下载的是zip压缩文件,很多帖子写的都是让你导入驱动,但 ...