【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); }
} 展开
我尝试存储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); }
} 展开
展开全部
找到问题了,原来很简单啊
问题出在了你的Save类中,你在Save类中,引用了一个Scanner类,而这个类是没有序列化的,也就是说Scanner类并没有implements Serializable,而implements Serializable的要求就是,所有implements Serializable的类,他下面所调用的,声明的类,也都需要经过序列化,也就是implements Serializable,但Scanner类没有,所以不行
解决方法:
把所有的输入操作,都放在Test类里完成,再通过入参的方法,传到ask()里面去,问题就解决了。
问题出在了你的Save类中,你在Save类中,引用了一个Scanner类,而这个类是没有序列化的,也就是说Scanner类并没有implements Serializable,而implements Serializable的要求就是,所有implements Serializable的类,他下面所调用的,声明的类,也都需要经过序列化,也就是implements Serializable,但Scanner类没有,所以不行
解决方法:
把所有的输入操作,都放在Test类里完成,再通过入参的方法,传到ask()里面去,问题就解决了。
追问
谢谢,原来是这个原因···修改后的代码确实效果正确了!
顺便问下,如果我把Scanner做成一个Input类,把要用的方法都写成static的,调用时类似In.nextLine();这样调用的话,是不是也能解决这个问题?
另外,请新进来的不用回答了,不久我就会采纳这个答案的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询