任务六 学生成绩查询与写入文件功能一、任务描述 在任务五的基础上,完成学生成绩查询功能和将成绩写入文件的功能。这里所说的成绩 查询功能并非从文件中查询已有数据,而是查询本次输入的所有数据,待打印出来检查无误后,再调用写入文件功能,将学生成绩信息写入txt文 件中。任务六 学生成绩查询与写入文件功能二、任务分析操作步骤如下:步骤一:添加select()方法,完成成绩查询功能;步骤二:添 加writeFile()方法,完成成绩信息写入txt文件功能。任务六 学生成绩查询与写入文件功能三、任务实施 任务概览:步骤一:添加select()方法,完成成绩查询功能;publ ic void select() throws IOException { this.judge(); System.out.p rintln(" 学生信息列表\r\n\r\n学号\t\t姓名\t\t班级\t\tsql成绩\t\tjava成绩\t\t网页制作成 绩\t\t体育成绩\r\n"); for (int i = 0; i < n; i++) { System.out.printl n(s[i].getSno() + "\t\t" + s[i].getName() + "\t\t" + s[i].getClas sname() + "\t\t" + s[i].getSql()+ "\t\t" + s[i].getJava() + "\t\t " + s[i].getWebdesign() + "\t\t\t" + s[i].getGym()); } System.o ut.println("系统返回主菜单!"); System.out.println(); this.menu(); }任务六 学生成绩查询与写入文件功能三、任务实施public void writeFile() throws IOException { FileWriter fw = new FileWriter(file, true); // 将学生信息录入指定的txt文件中 if (file.exists() && file.length() == 0) { fw.write(" 学生信息列表\r \n\r\n学号\t\t姓名\t\t班级\t\tsql成绩\t\tjava成绩\t\t网页制作成绩\t\t体育成绩\r\n"); }?for (int i = 0; i < n; i++) {fw.write(s[i].getSno() + "\t\t" + s[i].getName() + "\t\t" + s[i].getClassname() + "\t\t" + s[i].ge tSql()+ "\t\t" + s[i].getJava() + "\t\t\t" + s[i].getWebdesign() + "\t\t" + s[i].getGym() + "\r\n"); } fw.flush(); fw.close(); System.out.println("此次录入学生成绩已存入txt文件!"); }步骤二:添加writeFile()方法,完成 成绩录入情况显示功能。任务六 学生成绩查询与写入文件功能三、任务实施【注意】1、定义fw时,其关联文件“C:\\stu.txt” 如果不存在则提示错误,如下图所示,因此C盘下的txt文件在关联前需要先建立同名的txt文件,而其他盘则不会。2、文章读写操作需要对 可能出现的异常做出处理,通常的做法是向上抛出异常,throws Exception或者利用try...catch...final ly进行主动处理。3、设置学生对象的属性的值,因其是私有的,因此应采用setter方法,而不能用赋值符号直接赋值。图6-1 文件不 存在提示异常任务六 学生成绩查询与写入文件功能四、相关知识6.4.1 java中String的常用方法 表6-1 String中 的常用方法任务六 学生成绩查询与写入文件功能四、相关知识6.4.1 java中String的常用方法 表6-1 String中的 常用方法任务六 学生成绩查询与写入文件功能四、相关知识 public class Exp61 { public static v oid main(String[] args) { String str = "banana"; int a = 101; char[] charArray = str.toCharArray();// 字符串转换为字符数组 System.out.pr int("将字符串转换为字符数组的遍历结果:"); for (int i = 0; i < charArray.length; i++) { if (i != charArray.length - 1) { // 如不是数组最后的一个元素,则加逗号 System.out.print(charArray[i] + ","); } else { // 如是最后一个 元素,则不加逗号 System.out.print(charArray[i]); } } System.out.pr intln(); System.out.println(String.valueOf(a));// 将int型数据转换为Stri ng类型 System.out.println(str.toUpperCase());// 将字符串str转换为大写字母 }}运 行结果:【例6.1】字符串转换操作任务六 学生成绩查询与写入文件功能四、相关知识【例6.2】字符替换、去除空格、判断等操作pub lic class Exp62 { public static void main(String[] args) { St ring str=" Tomorrow will be better. "; String str1=new Stri ng("ok"); String str2=new String("ok"); //去除字符串前后空格 S ystem.out.println(str.trim()); //将英文句号替换为英文叹号 System.out. println(str.replace(''.'', ''!'')); //判断字符串是否为空 System.out.pr intln(str.isEmpty()); //判断两个字符串是否相等 System.out.println(st r.equals(str1)); //以下结果为true,因为str1和str2内容相同 System.out.p rintln(str1.equals(str2)); //以下结果为false,因为str1与str2是两个对象 System.out.println(str1==str2); //判断是否包含指定字符序列 System.ou t.println(str.contains("be")); }} 运行结果:【注意】 在程序中可以通过==和eq uals()两种方式对字符串进行比较,但这两种方式有明显的区别。equals()方法用于比较两个字符串的字符值是否相等,==方法用 于比较两个字符串对象的内存地址是否相同。任务六 学生成绩查询与写入文件功能四、相关知识 在程序开发中,经常需要对文 本内容进行读取,如果想从文件中直接读取字符就可以用字符流FileReader,通过该类可以从文件中读取一个或一组字符。如果需要写入 字符需要使用FileWriter。FileWriter类创建字符输出流类对象和已存在的文件相关联。构造方法1:FileWriter fw = new FileWriter(String fileName);例如: FileWriter fw = new Fi leWriter("C:\\demo.txt");下面的构造方法2将创建字符输出流类对象和已存在的文件相关联,并设置该流对文档的操 作是否为续写。构造方法2:FileWriter fw = new FileWriter(String fileName,boole an append);例如: FileWriter fw = new FileWriter("C:\\demo.txt",tru e); 6.4.2 FileWriter类任务六 学生成绩查询与写入文件功能四、相关知识【注意】(1)使用FileWriter 时,如果文件不存在,则会先创建文件,再写入数据;(2)根据构造方法1构造FileWriter,如果文件存在,则会先清空文件内容,再 进行写入;(3)根据构造方法2构造FileWriter,第二个参数为true时,对文档再次写入时,会在该文档的结尾续写,并不会覆盖 掉之前的数据。 6.4.2 FileWriter类表6-2 FileWriter的常用方法任务六 学生成绩查询与写入文件功能四、 相关知识【例6.3】import java.io.FileWriter;import java.io.IOException;?p ublic class Exp63 { public static void main(String[] args) throws IOException { //创建字符输出流对象,并指定输出文件 FileWriter fw=new FileWriter ("D:\\stu.txt"); //将定义的字符写入文件 fw.write("葡萄美酒夜光杯,\r\n"); fw.wri te("欲饮琵琶马上催,\r\n"); fw.write("醉卧沙场君莫笑,\r\n"); fw.write("古来征战几人回 。\r\n"); //关闭流 fw.close(); }} 6.4.2 FileWriter类运行结果:任务六 学生成绩查询 与写入文件功能四、相关知识 6.4.3 Filereader1.构造方法FileReader fr = new FileReade r(String fileName);//使用带有指定文件的String参数的构造方法。创建该输入流对象,并关联源文件。2.主要方 法int read(); // 读取单个字符。返回作为整数读取的字符,如果已达到流末尾,则返回 -1。int read(char []cbuf);//将字符读入数组。返回读取的字符数。如果已经到达尾部,则返回-1。void close();//关闭此流对象。释 放与之关联的所有资源。任务六 学生成绩查询与写入文件功能四、相关知识【例6.4】import java.io.FileReade r;?public class Exp64{ public static void main(String[] args) thr ows Exception { //创建FileReader对象,并指定需要读取的文件 FileReader fr=new F ileReader("D://stu.txt"); //定义一个int类型的变量len,其初始化为0 int len=0; //通过循环来判断是否读取到了文件末尾 while((len=fr.read())!=-1) { //输出读取的字符 S ystem.out.print((char)len); } //关闭流 fr.close(); }?} 任务六 学生成绩查 询与写入文件功能四、相关知识【例6.5】import java.io.FileReader;import java.io.File Writer;import java.io.IOException;?public class Exp65{? / 将D :\\的stu.txt copy 到 E:\\下 首先创建FileReader读取数据的读取流对象。 / public static void main(String[] args) { FileReader fr = null; FileWriter fw = null; try { fr = new FileReader("D:\\stu.txt" ); fw = new FileWriter("E:\\you.txt"); //读一个字符,写一个字符方法 int ch = 0; while ((ch = fr.read()) != -1) { fw.write(ch); } char []buf = new char[1024]; int len = 0; 任务六 学生成绩查询与写入 文件功能四、相关知识 //读一个数组大小,写一个数组大小方法。 while((len = fr.read(buf)) != -1){ fw.write(buf, 0, len); } } catch (Exception e) { System.out.println(e.toString()); } finally { if (fr != null) try { fr.close(); } catch (Exception e1) { throw ne w RuntimeException("关闭失败!"); } if (fw != null) try { fw.close(); } catch (IOException e2) { throw new RuntimeEx ception("关闭失败!"); } } }} 任务六 学生成绩查询与写入文件功能五、任务训练 1、编写程序,模拟银行ATM自动存取款机。 参考代码:import java.util.Scanner;class ATM { private String id; private String name; private double balance; private int password; public String getId() { return id; } publi c String getName() { return name; } public double getBalance() { return balance; } public int getPassword() { return password; } public ATM(String id, String name, double balance, int password ) { super(); this.id=id; this.name=name; this.balance=balance ; this.password=password; }任务六 学生成绩查询与写入文件功能五、任务训练 public void menu() { System.out.println("===================== ==="); System.out.println("\t1.存款"); System.out.println("\t2.取款 "); System.out.println("\t3.查询余额"); System.out.println("\t4.修改密 码"); System.out.println("\t5.退出"); System.out.println("请输入数字1 -5:"); System.out.println("========================"); } public void DrawMoney(double money) {// 取款方法 balance=balance-money; Sy stem.out.println("成功取出"+money+"元"); } public void DepositMoney(do uble money) {// 存款方法 balance=balance+money; System.out.println( "成功存入"+money+"元"); } public void ChangePassword(int newpassword1, int newpassword2) {//修改密码方法 if ((newpassword1==newpassword2)&&(n ewpassword1!=password)){ password=newpassword1; System.out.pr intln("密码修改成功!"); } else { System.out.println("输入有误,请重新修改密码!" ); } }}任务六 学生成绩查询与写入文件功能五、任务训练 public class ATMTes t{ public static void main(String[] args) { ATM atm=new ATM("1 23456789", "张丽", 2780,123456); int count=3;// 密码最多可输入三次 System. out.println("欢迎使用银行ATM自助服务"); while (true) {// 循环输入密码 System.o ut.println("请输入密码:"); Scanner sc=new Scanner(System.in); int password=sc.nextInt(); if (password==atm.getPassword()) { Sy stem.out.println("账户:"+atm.getId()); System.out.println("户名:"+ atm.getName()); atm.menu(); while (true) {// 循环取款存款方法 S ystem.out.println("1.取款 2.存款 3.查询 4.修改密码 5.退出"); int input=sc .nextInt(); switch (input) { case 1: System.out.pri ntln("输入取款金额"); int money1=sc.nextInt(); atm.DrawMoney( money1); break; case 2: System.out.println("输入存款金额 "); int money2=sc.nextInt(); atm.DepositMoney(money2); break; case 3: System.out.println("当前余额为:"+atm.getB alance()); break;任务六 学生成绩查询与写入文件功能五、任务训练 case 4: System.out.println("请输入新密码:"); int newpassword1 =sc.nextInt(); System.out.println("请再次输入新密码:"); int new password2=sc.nextInt(); atm.ChangePassword(newpassword1, new password2); break; case 5: System.out.println("谢谢使用 !已退出!"); System.exit(0); break; default: Syste m.out.println("您的输入有误"); } } } else { count--; if (count==0) { System.out.println("账户被冻结"); break;// 输入密码循环结束 } System.out.println("您输入的密码有误,还有"+count+"次机会"); } } }}任务六 学生成绩查询与写入文件功能六、拓展提高J父类对象和子类对象之间在一定条件下可以相互转换。1.向上转型即父类的引用指向了子类的对象。语法:父类类型 引用名= new 子类类型();向上转型时,可以调用父类类型中的所有成员,不能调用子类类型中的独有成员。2.向下转型语法:子类类型 引用名=(子类类型)父类引用;向下转型是为了通过父类强制转换为子类,从而调用子类独有的方法(向下转型在工程中很少用到)。为了保证向下转型的顺利完成,在java中提供了一个关键字:instanceof,通过instanceof可以判断某对象是否是某类的实例,如果是则返回true,否则返回false。6.6.1 父、子类对象的类型转换任务六 学生成绩查询与写入文件功能小 结本任务主要完成了学生成绩系统中查询学生成绩信息以及将学生成绩信息写入txt文件的功能,通过本任务的实施,我们复习巩固了前面任务中的相关知识,并进一步学习了String的常用方法、FileWriter类和FileReader类的使用。这将为后续任务的实施与学习打下坚实的基础。 |
|