完成同一个目的,不同的程序员绝对有不同的程序。多少个程序员就有多少种思路,真的,决定程序实用性的,就是一个程序员的思维。
举例来说吧,最近JAVA老师给我们布置了一个这样的题目,让我们完成。
对象流的使用
已知一个文件 student.db 中存储了几个 Student 类的对象,请编写一个程序,用户可以输入一个学生的姓名,然后在该文件中查找是否存在该学生的基本信息,如果不存在输出“姓名为**的学生信息不存在”,如果存在则输出该学生的基本信息。
注:[1] Student.java(注意该文件一定要放到缺省包中)和 student.db 在学院"ftp189/程序设计 Java"服务器上下载。
[2]已知该文件中存储的学生的姓名有张华、王小、李峰、赵涛等,请检验程序的运行结果。
我拿到题目,便想着先用while进行循环,得到数据文件中的对象的数量,同时再用一次while,其中使用equal函数来进行比对,然而呢,我发现,while读取对象的话,会产生EOFException,而第一次while产生异常后,第二个while就不会再运行了。于是,我和同学商量,他们说,他们也出现了这样的问题。这个时候呢,我想到一种方法,把第二个while用for代替,并且将它挪移到catch块中,这样就保证它的执行了。
这种方法确实可以执行,可效率和层次感一下子就降低了。下面我就来说一下老师的方法。
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Scanner;
import javax.swing.JOptionPane;
public class TestStudent {
public static void main(String[] args) {
// Scanner in = new Scanner(System.in);
// String name = in.nextLine();
String name=JOptionPane.showInputDialog("请输入姓名:");
Student student = null;
File file = new File("db/student.db");
try {
FileInputStream fileInputStream = new FileInputStream(file);
ObjectInputStream objectinputStream = new ObjectInputStream(fileInputStream);
while ((student = (Student) objectinputStream.readObject()) != null) {
if (name.equals(student.getName())) {
JOptionPane.showMessageDialog(null, student.toString());
break;
}
}
fileInputStream.close();
objectinputStream.close();
} catch (FileNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (EOFException e) {
System.out.println("没有找到这个学生!");
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
这个程序呢,就很高效的完成了程序,它用了一个 while,而在 while 中进行比较,则提高了它的简洁度和速率。同时呢,又运用了 catch 来完成没有找到的情况。
可以说是思路使程序一下子简便了好多,可见,一个程序的效率和程序员的思维相关多密切。