【java问题】用ObjectOutputStream和ObjectInputStream存储整个Object后,读取Object中的数据失败,为什么

代码有点儿长,我大概解释一下:我尝试存储save这个Object,希望关闭程序后再读取save,并显示出save中的txt这个变量中储存的字符串。程序编译成功,但每次显示... 代码有点儿长,我大概解释一下:
我尝试存储save这个Object,希望关闭程序后再读取save,并显示出save中的txt这个变量中储存的字符串。程序编译成功,但每次显示出来的字符串都是空,求错误在哪儿。

请不要说存储String的方法,存储String我试过可以,问题是有个程序我需要存储大量的数据,最好是能把整个系统作为一个Object存储起来,所以才做这个测试的。

如果能解决这个问题,代码能用,加100分都没问题

import java.util.*;
import java.io.*;

public class Test
{
private Save save;
private File file = new File("test.txt");

public static void main(String[] args)
{ Test test = new Test(); }

public Test()
{ save = read();
save.print();
boolean run = true;
while(true)
{ run = save.ask();
if(!run)
{ write(save);
System.exit(0);
}
}
}

public void write(Object o)
{ try
{ FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream ops = new ObjectOutputStream(fos);
ops.writeObject(o);
ops.flush();
ops.close();
}
catch(Exception e){}
}

public Save read()
{ Save s;
try
{ FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
s = (Save) ois.readObject();
ois.close();
}
catch(Exception e)
{ s = new Save(); }
return s;
}
}

class Save implements Serializable
{
private String txt;
private Scanner in = new Scanner(System.in);

public Save()
{ txt = ""; }

public boolean ask()
{ System.out.print("Enter data: ");
String t = in.nextLine();

if(t.length()>0)
{ txt += t;
return true;
}
else
{ return false; }
}

public void print()
{ System.out.println(txt); }
}
展开
 我来答
kingofsong
2011-09-14 · TA获得超过168个赞
知道小有建树答主
回答量:230
采纳率:100%
帮助的人:85.9万
展开全部
找到问题了,原来很简单啊
问题出在了你的Save类中,你在Save类中,引用了一个Scanner类,而这个类是没有序列化的,也就是说Scanner类并没有implements Serializable,而implements Serializable的要求就是,所有implements Serializable的类,他下面所调用的,声明的类,也都需要经过序列化,也就是implements Serializable,但Scanner类没有,所以不行
解决方法:
把所有的输入操作,都放在Test类里完成,再通过入参的方法,传到ask()里面去,问题就解决了。
追问
谢谢,原来是这个原因···修改后的代码确实效果正确了!
顺便问下,如果我把Scanner做成一个Input类,把要用的方法都写成static的,调用时类似In.nextLine();这样调用的话,是不是也能解决这个问题?
另外,请新进来的不用回答了,不久我就会采纳这个答案的
ymiqplgao
2011-09-15 · TA获得超过646个赞
知道小有建树答主
回答量:512
采纳率:0%
帮助的人:393万
展开全部
非基本类型对象要存储都必须实现序列化,不管是子对象还是父对象本身都要实现序列化。
追问
类似的说明看到过很多次了,不过一直没把Scanner当数据看待,把它忽略了····
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式