代码如下:想要实现system.in 来输入学生信息,然后添加到students.dat这个文件中.但object流加上后就报错了..劳驾各位了.最好能附带给个解决问题的思路...
package API;import java.io.*;public class Studentinfo {
static BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Student stu1 = getStudent();
/*
* System.out.println(stu1.name);
* System.out.println(stu1.record[0]);
* System.out.println(stu1.record[1]);
* System.out.println(stu1.record[2]);
* System.out.println(stu1.record[3]);
*/
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/Students.dat")); //这里想要的功能
public static Student getStudent() throws IOException
{
Student stu = new Student();
System.out.print("请输入姓名:");
String name = br.readLine();
stu.name = name; int score1 = -1;
do {
System.out.print("请输入国语成绩:");
String s1 = br.readLine();
try {
score1 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score1 < 0 || score1 > 100);
stu.record[0] = score1; int score2 = -1;
do {
System.out.print("请输入英语成绩:");
String s1 = br.readLine();
try {
score2 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score2 < 0 || score2 > 100);
stu.record[1] = score2; int score3 = -1;
do {
System.out.print("请输入数学成绩:");
String s1 = br.readLine();
try {
score3 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score3 < 0 || score3 > 100);
stu.record[2] = score3; int score4 = -1;
do {
System.out.print("请输入科学成绩:");
String s1 = br.readLine();
try {
score4 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score4 < 0 || score4 > 100);
stu.record[3] = score4;
stu.score();
return stu;
}
}class Student {
String name;
static int[] record = new int[4];
int total;
float avg;
String grade; public Student() { } public int getSum() {
return (record[0] + record[1] + record[2] + record[3]);
} public int avg() {
return getSum() / 4;
} public void score() {
System.out.println("姓名:" + name);
System.out.println("国语成绩:" + record[0]);
System.out.println("英语成绩:" + record[1]);
System.out.println("数学成绩:" + record[2]);
System.out.println("科学成绩:" + record[3]);
System.out.println("总分:" + getSum());
System.out.println("平均分:" + avg());
} public Student(String name, int[] record, int total, float avg, String grade) {
super();
this.name = name;
this.record = record;
this.total = total;
this.avg = avg;
this.grade = grade;
}
// 定义构造函数,getset方法,返回总分,平均分,学分方法.
// 文件名Student.dat ObjectOutputStream.
}
package API;import java.io.*;public class Studentinfo {
static BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Student stu1 = getStudent();
/*
* System.out.println(stu1.name);
* System.out.println(stu1.record[0]);
* System.out.println(stu1.record[1]);
* System.out.println(stu1.record[2]);
* System.out.println(stu1.record[3]);
*/
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e:/Students.dat")); //这里想要的功能
public static Student getStudent() throws IOException
{
Student stu = new Student();
System.out.print("请输入姓名:");
String name = br.readLine();
stu.name = name; int score1 = -1;
do {
System.out.print("请输入国语成绩:");
String s1 = br.readLine();
try {
score1 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score1 < 0 || score1 > 100);
stu.record[0] = score1; int score2 = -1;
do {
System.out.print("请输入英语成绩:");
String s1 = br.readLine();
try {
score2 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score2 < 0 || score2 > 100);
stu.record[1] = score2; int score3 = -1;
do {
System.out.print("请输入数学成绩:");
String s1 = br.readLine();
try {
score3 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score3 < 0 || score3 > 100);
stu.record[2] = score3; int score4 = -1;
do {
System.out.print("请输入科学成绩:");
String s1 = br.readLine();
try {
score4 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score4 < 0 || score4 > 100);
stu.record[3] = score4;
stu.score();
return stu;
}
}class Student {
String name;
static int[] record = new int[4];
int total;
float avg;
String grade; public Student() { } public int getSum() {
return (record[0] + record[1] + record[2] + record[3]);
} public int avg() {
return getSum() / 4;
} public void score() {
System.out.println("姓名:" + name);
System.out.println("国语成绩:" + record[0]);
System.out.println("英语成绩:" + record[1]);
System.out.println("数学成绩:" + record[2]);
System.out.println("科学成绩:" + record[3]);
System.out.println("总分:" + getSum());
System.out.println("平均分:" + avg());
} public Student(String name, int[] record, int total, float avg, String grade) {
super();
this.name = name;
this.record = record;
this.total = total;
this.avg = avg;
this.grade = grade;
}
// 定义构造函数,getset方法,返回总分,平均分,学分方法.
// 文件名Student.dat ObjectOutputStream.
}
给的条件是,已知的学生类 和 学生信息 通过system.in 实现输入学生信息后 反馈信息 然后添加到dat文件中.
这个问题如果分析的话如何入手? 劳驾给个详细的分析步骤. 老师教的太bt 我们都不了解他的思路 每次分配任务后 他都是拿现成的代码 带我们找main方法走一遍... 都不分析解决方法和思路..
static BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Student stu1 = getStudent();
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Students.bat")); //这里想要的功能
oos.writeObject(stu1);//将对象持久化。
ObjectInputStream rd = new ObjectInputStream(new FileInputStream("Students.txt"));
Student stu2=(Student)rd.readObject();//恢复数据;
System.out.println(stu2);
/*
* System.out.println(stu1.name);
* System.out.println(stu1.record[0]);
* System.out.println(stu1.record[1]);
* System.out.println(stu1.record[2]);
* System.out.println(stu1.record[3]);
*/
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Student getStudent() throws IOException
{
Student stu = new Student();
System.out.print("请输入姓名:");
String name = br.readLine();
stu.name = name; int score1 = -1;
do {
System.out.print("请输入国语成绩:");
String s1 = br.readLine();
try {
score1 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score1 < 0 || score1 > 100);
stu.record[0] = score1; int score2 = -1;
do {
System.out.print("请输入英语成绩:");
String s1 = br.readLine();
try {
score2 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score2 < 0 || score2 > 100);
stu.record[1] = score2; int score3 = -1;
do {
System.out.print("请输入数学成绩:");
String s1 = br.readLine();
try {
score3 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score3 < 0 || score3 > 100);
stu.record[2] = score3; int score4 = -1;
do {
System.out.print("请输入科学成绩:");
String s1 = br.readLine();
try {
score4 = Integer.parseInt(s1); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score4 < 0 || score4 > 100);
stu.record[3] = score4;
stu.score();
return stu;
}
}class Student implements Serializable {
String name;
static int[] record = new int[4];
int total;
float avg;
String grade; public Student() { } public int getSum() {
return (record[0] + record[1] + record[2] + record[3]);
} public int avg() {
return getSum() / 4;
} public void score() {
System.out.println("姓名:" + name);
System.out.println("国语成绩:" + record[0]);
System.out.println("英语成绩:" + record[1]);
System.out.println("数学成绩:" + record[2]);
System.out.println("科学成绩:" + record[3]);
System.out.println("总分:" + getSum());
System.out.println("平均分:" + avg());
} public Student(String name, int[] record, int total, float avg, String grade) {
super();
this.name = name;
this.record = record;
this.total = total;
this.avg = avg;
this.grade = grade;
}
// 定义构造函数,getset方法,返回总分,平均分,学分方法.
// 文件名Student.dat ObjectOutputStream.
}
改成 :
ObjectInputStream rd = new ObjectInputStream(new FileInputStream("Students.bat"));
import java.io.Serializable;public final class Student implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1242488725373207929L;
private String stuNo;//学号
private String stuName;//名字
private double stuNationalScore=0;//国语
private double stuEngScore=0;//英语
private double stuMathScore=0;//数学
private double stuScienceScore=0;//科学
public Student() {
}
public Student(String stuNo,String name, double stuNationalScore, double stuEngScore, double stuMathScore, double stuScienceScore) {
setStuNo(stuNo);
setStuName(name);
setStuNationalScore(stuNationalScore);
setStuEngScore(stuEngScore);
setStuMathScore(stuMathScore);
setStuScienceScore(stuScienceScore);
}
public double getStuEngScore() {
return stuEngScore;
}
public void setStuEngScore(double stuEngScore) {
this.stuEngScore = stuEngScore;
}
public double getStuMathScore() {
return stuMathScore;
}
public void setStuMathScore(double stuMathScore) {
this.stuMathScore = stuMathScore;
}
public double getStuNationalScore() {
return stuNationalScore;
}
public void setStuNationalScore(double stuNationalScore) {
this.stuNationalScore = stuNationalScore;
}
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public double getStuScienceScore() {
return stuScienceScore;
}
public void setStuScienceScore(double stuScienceScore) {
this.stuScienceScore = stuScienceScore;
}
public double sumScore(){//总分
double sum=getStuNationalScore()+getStuScienceScore()+getStuEngScore()+getStuMathScore();
return sum;
}
public double avgScore(){//平均成绩
return sumScore()/5;
}
public String getStuName() {
return stuName;
}
public void setStuName(String strName) {
this.stuName = strName;
}
}
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;/**
*
* @author test
*
*
*/
public class StudentInfo {
private static FileOutputStream saveFile;
private static FileInputStream readFile;
private static final String FILENAME="./Student.dat";
public static double showMessage(String message){//显示输入提示
BufferedReader br = null;
br=new BufferedReader(new InputStreamReader(System.in));
double score=0;
do {
System.out.print(message);
String strScore="";
try{
strScore = br.readLine();
}catch(IOException ee){
ee.printStackTrace();
}
try {
score = Double.parseDouble(strScore); } catch (NumberFormatException e) {
// TODO Auto-generated catch block
System.out.print("输入错误请重新输入:");
}
} while (score < 0 || score > 100);
return score;//返回分数
}
public static void saveStuObj(Student stuObj){//保存对象
ObjectOutputStream saveObj=null;
try{
try{
FileInputStream tempRead=new FileInputStream(FILENAME);
saveFile=new FileOutputStream(FILENAME,true);//以追加方式写入对象
saveObj=new ObjectOutputStream(saveFile){//第n次写
//如是果要附加对象到文件后
//必须重新定义这个方法
protected void writeStreamHeader()
throws IOException{}
};
}catch(FileNotFoundException e){ saveObj=new ObjectOutputStream(new FileOutputStream(FILENAME));//第一次写
}
saveObj.writeObject(stuObj);
}catch(IOException ee){
ee.printStackTrace();
}
}
public static ArrayList<Student> readStuObj(FileInputStream file){//遍历文件中的所有对象
ArrayList<Student> stuList= new ArrayList<Student>();
try{
ObjectInputStream readObj = new ObjectInputStream(file);
Object obj=null;
while(file.available()>0){//看文件里是否还有数据
obj =readObj.readObject();
if(obj instanceof Student){
Student stu = (Student)obj;
stuList.add(stu);
}
}
return stuList;
}catch(Exception ee){
ee.printStackTrace();
}
return null;
}
public static Student readStuData(){//根据键盘的信息得到整个对象
BufferedReader br = null;
br=new BufferedReader(new InputStreamReader(System.in));
Student stuObj = new Student();
System.out.print("请输入姓名:");
try{
String strName = br.readLine();
stuObj.setStuName(strName);
}catch(IOException ee){
ee.printStackTrace();
}
/********************************/
double nationalScore=showMessage("请输入国语成绩:");
double engScore= showMessage("请输入英语成绩:");
double matchScore= showMessage("请输入数学成绩:");
double scienceScore=showMessage("请输入科学成绩:");
stuObj.setStuNationalScore(nationalScore);
stuObj.setStuEngScore(engScore);
stuObj.setStuMathScore(matchScore);
stuObj.setStuScienceScore(scienceScore);
/********************************/
double sum =stuObj.sumScore();
System.out.println("总分:"+sum);
double avg = stuObj.avgScore();
System.out.println("平均成绩:"+avg); return stuObj;
}
public static void main(String[] args) {
Student stuObj=null;
stuObj=readStuData();//根据键盘的信息得到整个对象
/**********保存对象**********************/
try{
saveStuObj(stuObj);//保存对象
System.out.println("保存成功");
}catch(Exception ee){
ee.printStackTrace();
}
/*************读取对象*******************/
try{
readFile = new FileInputStream(FILENAME);
ArrayList<Student> stuList=readStuObj(readFile);
for(Student tempStu:stuList){
System.out.println("*********************");
System.out.println("姓名:"+tempStu.getStuName()+": ");
System.out.println("总分:"+tempStu.sumScore()+" ");
System.out.println("平均成绩:"+tempStu.avgScore());
}
}catch(Exception ee){
ee.printStackTrace();
}
/***************************************/
}}
*********************
姓名:89:
总分:267.0
平均成绩:53.4
*********************
姓名:wang:
总分:260.0
平均成绩:52.0
*********************
姓名:Li:
总分:291.0
平均成绩:58.2
用ObjectOutputStream写对象分两种形式:追加和替换(要分别对待)