我已经在我的java赋值中创建了一个方法来写入LinkedList
的文件(我使用了序列化),然后我创建了另一个方法来将文件读入inkedList
。以下是我方法的正文:
try {
FileInputStream fin = new FileInputStream("c:\\Info.ser");
ObjectInputStream ois = new ObjectInputStream(fin);
Employee e = (Employee) ois.readObject();
linkP.add(e);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
但它无法正常工作。我想这一部分:
Employee e = (Employee) ois.readObject();
linkP.add(e);
只将文件的第一个对象读入到链表中并忽略其他对象。我将它包围for循环和while循环几次,但它导致EOFException
。如何更改我的方法以将所有文件的对象读入LinkedList?
答案 0 :(得分:3)
如果使用LinkedList进行序列化,则应该期望LinkedList反序列化:
linkP= (LinkedList) ois.readObject();
而不是
Employee e = (Employee) ois.readObject();
linkP.add(e);
答案 1 :(得分:1)
您确定序列化文件是否包含所有元素?在我看来,你可能只是序列化一个。
答案 2 :(得分:1)
最简单的方法是将列表的大小作为写入文件的第一件事。当您读取文件时,您检索的第一件事就是大小。然后,您可以读取预期的对象数。
答案 3 :(得分:1)
注意:还请添加创建info.ser文件的代码,因为您可能通过关闭/重新打开每个对象来损坏ObjectOutputStream。
但是要回答你的问题,正确这样做的方法(没有捕获例外)将是:
@Test
public void testSerializingListByEntries() throws Exception {
List<Serializable> list = new ArrayList<Serializable>();
list.add(new Date());
list.add(new Date());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeInt(list.size()); // Magic
for(Serializable o : list) {
oos.writeObject(o);
}
oos.close();
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
int count = ois.readInt();
List<Object> newList = new ArrayList<Object>();
for(int i = 0; i < count;i++) {
newList.add(ois.readObject());
}
ois.close();
assertEquals(list,newList);
}
是的,你需要自己关闭溪流。为了便于阅读而省略。
答案 4 :(得分:0)
可能需要先了解你的写作方式,但通常是:
ObjectInputStream is = null;
try
{
is = new ObjectInputStream(new FileInputStream("c:/Info.ser"));
Object object = null;
while ((object = is.readObject()) != null)
{
linkP.add(object);
}
}
catch(Exception e)
{
//Whatever you need to do
}
finally
{
//Never forget to close your streams or you'll run into memory leaks
try
{
if (is != null)
{
is.close();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
此外,它可能更好的做法,你可以单独处理异常,但我无法确定流抛出什么,所以用其他所有东西替换(例外e)。
答案 5 :(得分:0)
环绕Employee e = (Employee) ois.readObject();
linkP.add(e);
并按照建议使用for
循环,并使用.readObject
try/catc(EOFException)
来电
答案 6 :(得分:0)
只需在读取循环中单独捕获EOFException并相应地处理它,即跳出循环。