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的数据读出。(截图关键代码,出现学号)

//201521123025
import java.io.*;
import java.util.*; class Student {
private int id;
private String name;
private int age;
private double grade; public Student(){ }
public Student(int id, String name, int age, double grade) {
this.id = id;
this.setName(name);
this.setAge(age);
this.setGrade(grade);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
if (name.length()>10){
throw new IllegalArgumentException("name's length should <=10 "+name.length());
}
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age<=0){
throw new IllegalArgumentException("age should >0 "+age);
}
this.age = age;
}
public double getGrade() {
return grade;
}
public void setGrade(double grade) {
if (grade<0 || grade >100){
throw new IllegalArgumentException("grade should be in [0,100] "+grade);
}
this.grade = grade;
} @Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", age=" + age + ", grade=" + grade + "]";
}
public void writeData(PrintWriter out) { out.println(id+"|"+name+"|"+age+"|"+grade); }
public void readData(Scanner in)
{
String line = in.nextLine();
String[] tokens = line.split("\\|");
id = Integer.parseInt(tokens[0]);
name=tokens[1];
age=Integer.parseInt(tokens[2]);
grade=Double.parseDouble(tokens[3]); } } public class Test{
public static void main(String[] args){
Student[] stu=new Student[3];
stu[0]=new Student(1,"张三",19,65);
stu[1]=new Student(2,"李四 ",19,75);
stu[2]=new Student(25,"林振斌",20,85);
try{
PrintWriter out=new PrintWriter("d:/student.txt");
Writedata(stu,out);
out.close();
Scanner in=new Scanner(new FileReader("d:/student.txt"));
Student[] newstu=readData(in);
in.close();
for (Student e : newstu)
System.out.println(e);
}catch (IOException exception)
{
exception.printStackTrace();
} } private static Student[] readData(Scanner in) {
int n = in.nextInt();
in.nextLine(); // consume newline Student[] stus = new Student[n];
for (int i = 0; i < n; i++)
{
stus[i] = new Student();
stus[i].readData(in);
}
return stus;
} private static void Writedata(Student[] stu, PrintWriter out)throws IOException {
out.println(stu.length); for (Student e : stu)
e.writeData(out);
}
}



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目录

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("student.txt"));
out.wirteObject(student);
out.close();
objectInputStream in = new objectInputStream(new FileOutputStream("student.txt"));
Student[] new Student = (Student[])in.readOject();
in.close;
for(Student e :new Student)
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相同的文件名,一旦找到就马上输出到控制台。(截图关键代码,出现学号)

public static void findFile(String path,String filename){
File pathName = new File(path);
String[] fileName = pathName.list();
for (String string : fileName) {
File file1= new File(pathName.getAbsolutePath(),string);
if (string.equals(filename)) {
System.out.println(f.getAbsolutePath());
}
if (file1.isDirectory()) {
findFile(file1.getAbsolutePath(),filename);
}
}

Q8. 正则表达式

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

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

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

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. Linux Oracle服务启动&停止脚本与开机自启动[转]

    在CentOS 6.3下安装完Oracle 10g R2,重开机之后,你会发现Oracle没有自行启动,这是正常的,因为在Linux下安装Oracle的确不会自行启动,必须要自行设定相关参数,首先先介 ...

  2. DOS批处理中%cd%和%~dp0的区别[forward]

    DOS批处理中%cd%和%~dp0的区别   在DOS的批处理中,有时候需要知道当前的路径. 在DOS中,有两个环境变量可以跟当前路径有关,一个是%cd%, 一个是%~dp0.      这两个变量的 ...

  3. C#基础课堂笔记

    第三章:运算符和表达式 1.认识运算符:运算符又叫操作符,是一个运用于运算的符号,它作用于一个或多个操作数 运算符的分类:      (1)按操作数量  一元(目)运算符    作用于一个操作数  二 ...

  4. Hadoop集群环境搭建(一)

    1集群简介 HADOOP集群具体来说包含两个集群:HDFS集群和YARN集群,两者逻辑上分离,但物理上常在一起 HDFS集群: 负责海量数据的存储,集群中的角色主要有 NameNode / DataN ...

  5. noip普及组2007 纪念品分组

    纪念品分组 描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组 ...

  6. Struts2学习笔记(七)——类型转换

    1.自动类型转换 Struts2内部提供大量类型转换器,用来完成数据类型转换问题: String和boolean.Boolean:完成字符串与布尔值之间的转换 String和char.Characte ...

  7. 用Html模仿百度一下你就知道

    用Html模仿百度一下你就知道.... ------------------------------- <!doctype html> <html lang="en&quo ...

  8. 7.21.02 switch语句

    switch语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. 语法 switch语法格式如下: switch(expression) { case value : //语句 break ...

  9. Struts拦截器解析

    内建拦截器可以去struts-core.jar中的struts-default.xml文件中查看: 在没有引用内建拦截器时,已经帮我们指定了一个默认的拦截器: 使用的软件为MyEclipse:很强大!

  10. Java GUI学习心得

    虽然GUI的应用已经不是特别广泛了,但是如果了解一点,可以做些自己想要的工具,最近做了一个工具(是什么就不提了),当然碰到很多的问题,都意义解决了,现在分享出来. 1.关于窗体面板的显示问题 可能会遇 ...