对象的序列化异常及从文件里反序列化多个对象

对象的序列化异常及从文件里反序列化多个对象

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.io.Serializable;
import java.util.Comparator;
import java.util.InputMismatchException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

public class LinkedListDemo implements Serializable{
	private List<StuGrade> list;

	public List<StuGrade> getList() {
		return list;
	}

	public void setList(List<StuGrade> list) {
		this.list = list;
	}

	public LinkedListDemo() {
		list = new LinkedList<StuGrade>();
	}

	Scanner sc = new Scanner(System.in);

	// 1.用户从界面输入学生成绩
	public void InputGrade(StuGrade sg) {
float a1,a2,a3,a4=0;
		System.out.println("姓名");
		sg.setName(sc.next());
		boolean flag;
		a1 = a2 = a3 = a4 = 0;
		String b = null;
		System.out.println("请输入相应成绩(满分为100)");
		do {
			flag = true;
			try {
				if (a1 == 0) {
					System.out.print("语文成绩:");
					a1 = sc.nextFloat();
				}
				if(a1 < 0 || a1 >100) {
					throw new Grade1();
				}
			} catch(Grade1 e) {
				System.out.println(e.getMessage());
				a1 = 0;
				flag = false;
				continue;
			}catch (InputMismatchException e) {
				// TODO: handle exception
				System.out.println("请勿输入除0-100外的其他字符");
				b = sc.next();
				flag = false;
				continue;
			}

			try {
				if (a2 == 0) {
					System.out.print("数学成绩:");
					a2 = sc.nextFloat();
				}
				if(a2 < 0 || a2 >100) {
					throw new Grade1();
				}
			} catch(Grade1 e) {
				System.out.println(e.getMessage());
				a2 = 0;
				flag = false;
				continue;
			}catch (InputMismatchException e) {
				// TODO: handle exception
				System.out.println("请勿输入除0-100外的其他字符");
				b = sc.next();
				flag = false;
				continue;
			}

			try {
				if (a3 == 0) {
					System.out.print("英语成绩:");
					a3 = sc.nextFloat();
				}
				if(a3 < 0 || a3 >100) {
					throw new Grade1();
				}
			} catch(Grade1 e) {
				System.out.println(e.getMessage());
				a3 = 0;
				flag = false;
				continue;
			}catch (InputMismatchException e) {
				// TODO: handle exception
				System.out.println("请勿输入除0-100外的其他字符");
				b = sc.next();
				flag = false;
				continue;
			}
			try {
				if (a4 == 0) {
					System.out.print("Java成绩:");
					a4 = sc.nextFloat();
				}
				if(a4 < 0 || a4 >100) {
					throw new Grade1();
				}
			} catch(Grade1 e) {
				System.out.println(e.getMessage());
				a4 = 0;
				flag = false;
				continue;
			}catch (InputMismatchException e) {
				// TODO: handle exception
				System.out.println("请勿输入除0-100外的其他字符");
				b = sc.next();
				flag = false;
				continue;
			}
		} while (!flag);

		sg.setChinese(a1);
		sg.setMath(a2);
		sg.setEnglish(a3);
		sg.setJava(a4);
		this.getList().add(sg);
	}

	// 2.显示学生信息
	public void display() {
		System.out.println("以下是学生成绩信息:");
		Iterator<StuGrade> it = this.getList().iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}

	// 用户可以自定义设置权值
	public void weighted() {
		System.out.println("是否更改默认权值(科目权值均为0.25)");
		System.out.println("1.是");
		System.out.println("2.否");
		int n = sc.nextInt();
		float a1, a2, a3, a4;
		a1 = a2 = a3 = a4 = 0.25f;
		switch (n) {
		case 2:
			break;
		case 1:
			boolean flag;
			a1 = a2 = a3 = a4 = 0;
			String b = null;
			System.out.println("请为每一项成绩设置加权值(总权值不超过1)");
			do {
				flag = true;
				try {
					if (a1 == 0) {
						System.out.print("语文加权值:");
						a1 = sc.nextFloat();
					}
				} catch (InputMismatchException e) {
					// TODO: handle exception
					System.out.println("请勿输入除0-1外的其他字符");
					b = sc.next();
					flag = false;
					continue;
				}

				try {
					if (a2 == 0) {
						System.out.print("数学加权值:");
						a2 = sc.nextFloat();
					}
				} catch (InputMismatchException e) {
					// TODO: handle exception
					System.out.println("请勿输入除0-1外的其他字符");
					b = sc.next();
					flag = false;
					continue;
				}

				try {
					if (a3 == 0) {
						System.out.print("英语加权值:");
						a3 = sc.nextFloat();
					}
				} catch (InputMismatchException e) {
					// TODO: handle exception
					System.out.println("请勿输入除0-1外的其他字符");
					b = sc.next();
					flag = false;
					continue;
				}

				try {
					if (a4 == 0) {
						System.out.print("Java加权值:");
						a4 = sc.nextFloat();
					}
				} catch (InputMismatchException e) {
					// TODO: handle exception
					System.out.println("请勿输入除0-1外的其他字符");
					b = sc.next();
					flag = false;
					continue;
				}

				try {
					if ((a1 + a2 + a3 + a4) != 1) {
						throw new weighted1();
					}
				} catch(weighted1 e) {
					System.out.println(e.getMessage());
					a1 = a2 = a3 = a4 = 0;
					flag = false;
					continue;
				}
				catch (Exception e) {
					e.printStackTrace();
				}
			} while (!flag);
			break;
		}
		Iterator<StuGrade> it = this.getList().iterator();
		while (it.hasNext()) {
			StuGrade sg = it.next();
			sg.setAve(a1 * sg.getChinese() + a2 * sg.getMath() + a3 * sg.getEnglish() + a4 * sg.getJava());
		}
	}

	// 3.升序排列
	class Ascending implements Comparator<StuGrade> {
		@Override
		public int compare(StuGrade o1, StuGrade o2) {
			// TODO Auto-generated method stub
			return new Float(o1.getAve()).compareTo(new Float(o2.getAve()));
		}
	}

	// 4.降序排列
	class Descending implements Comparator<StuGrade> {
		@Override
		public int compare(StuGrade o1, StuGrade o2) {
			// TODO Auto-generated method stub
			return new Float(o2.getAve()).compareTo(new Float(o1.getAve()));
		}
	}

	// 5.导入学生成绩文件
	public void InputFile() {
		// 读取
		Scanner input = null;
		try {
			FileInputStream fis = new FileInputStream("chengji.txt");
			InputStreamReader isr = new InputStreamReader(fis);
			input = new Scanner(fis, "GBK");
		} catch (FileNotFoundException e) {
			// TODO: handle exception
			System.out.println("此文件不存在");
		} catch (IOException e) {
			// TODO: handle exception
			e.printStackTrace();
		}

		while (input.hasNext()) {
			for (int i = 0; i < 3; i++) {
				StuGrade sg = new StuGrade();
				sg.setName(input.next());
				sg.setChinese(input.nextFloat());
				sg.setMath(input.nextFloat());
				sg.setEnglish(input.nextFloat());
				sg.setJava(input.nextFloat());
				this.getList().add(sg);
			}
		}
		System.out.println("txt 内容:");
		this.display();
	}

	// 6.将学生成绩导出到ave.txt文件
	public void OutputFile() {
		try {
			FileOutputStream fos = new FileOutputStream("ave.txt");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
System.out.println(this);
			oos.writeObject(this);
				oos.flush();
				fos.close();
				oos.close();
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

		

	// 7.将文件内容反序列化
	public void InputObject() {
		try {
			FileInputStream fis = new FileInputStream("ave.txt");
			ObjectInputStream ois = new ObjectInputStream(fis);
			// 怎么将文件里的多个对象反序列化输出?不知道怎么写循环诶
//			LinkedListDemo lld1 = (LinkedListDemo) ois.readObject();
			List lld1 = (LinkedList) ois.readObject();
			Iterator<StuGrade> it = lld1.iterator();
			while(it.hasNext()) {
				System.out.println(it.next());
				
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		System.out.println("反序列化成功!");

	}

}

这是我LinkedListDemo类的全部代码,刚刚输出了this 里面确实没有东西。

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

你往里写的时候是一个List的对象,读的时候还是读一个List对象。这个要统一,参看26行和39行。你看一下你的代码是不是不统一了呢。另我输入的有中文输出的还是中文这个没有问题的呀,中间的过程如ave.txt文件你不用管的。

http://img1.sycdn.imooc.com/climg//59c2162e00018a9807850905.jpg

  • 櫻絳_ 提问者 #1
    谢谢,我确实没有序列化。 我先将文件里的信息导入,构成了链表,在排序后,将成绩导入文件,然后反序列化输出。 但是依然什么也没有输出,也没有报错。 我将修改后的代码放在最上面了,重新编辑了问题,请助教往上看~
    2017-09-20 15:50:08
  • 好帮手慕雪 回复 提问者 櫻絳_ #2
    oos.writeObject(this);中的this是什么?是LinkedList<StuGrade>吗?你先在它的上面输出一下this,是不是它没有内容呢?
    2017-09-20 16:03:25
  • 櫻絳_ 提问者 回复 好帮手慕雪 #3
    嗯嗯 刚刚输出了里面确实没有东西。但this不就是指当前实例化的LinkedList吗? 我又重新编辑了问题,贴出了我的LinkedListDemo里的全部代码。 谢谢助教的耐心~
    2017-09-20 16:12:16
提问者 櫻絳_ 2017-09-20 13:45:17
	
	// 7.将文件内容反序列化
	public void InputObject() {
		try {
			FileInputStream fis = new FileInputStream("ave.txt");
			ObjectInputStream ois = new ObjectInputStream(fis);
			// 怎么将文件里的多个对象反序列化输出?不知道怎么写循环诶
			LinkedListDemo lld1 = (LinkedListDemo) ois.readObject();
			System.out.println(lld1);
			Iterator<StuGrade> it = lld1.getList().iterator();
			while(it.hasNext()) {
				System.out.println(it.next());
				
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		System.out.println("反序列化成功!");

	}

问题一:先反序列化了LinkedList 再循环输出,但只输出了“反序列化成功”几个字,中间没有任何的输出结果,也没有报错。请问我该怎么改呢?

问题二:方法6导出文件,查看了writeUTF()只能传入字符串 却不能传入对象。而且我想输出中文,应该用GBK 但是API里没有给出相应的方法。

*************************************************************************************************

上题的问题一已解决,是因为括号位置打错了,才发现,谢谢助教~

好帮手慕雪 2017-09-19 20:02:00

1)FileOutputStream没有writeBytes()这个方法。你在代码中却用了。有write(传byte数组)。2)ObjectOutputStream可以有writeUTF(name);   3)将若干个对象都装入一个容器中(如:ArrayList之类),然后将容器这一个对象写入就行了。读取时,只要读取一个对象(即容器对象)就行了。然后遍历得到所有的对象。作业中如果有疑问,可在问答区进行提问,我们的助教老师会帮您答疑解惑,祝学习愉快!

  • 提问者 櫻絳_ #1
    助教,请看一下楼上,还存在问题。谢谢
    2017-09-20 13:45:57
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师