EDITED Так что я пытаюсь сохранить в объектах .ser типа типа Product (с указанием имени, количества, цены), как следует: каждый раз, когда я добавляю новый продукт, я добавляю его в файл. Затем, каждый раз, когда я запускаю окно, я хочу, чтобы прочитать эти продукты я ранее сохраненные, в виде TreeSet, вызвав следующий метод в конструкторе окна:Java Serializable EOF
public void updateCurrentProducts()
{
Product p=null;
System.out.println("Updating the tree of products.");
try
{
FileInputStream fileIn = new FileInputStream("products.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
int c;
// if((c=in.read()) != -1)
{
// System.out.println("Not eof yet.");
while ((p = (Product) in.readObject()) != null)
{
addProduct(p);
System.out.println("Just found "+p.name+".");
}
}
in.close();
fileIn.close();
}catch(IOException ix)
{
ix.printStackTrace();
return;
} catch (ClassNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Это как добавить продукты:
public void addProduct(Product p)
{
System.out.println("Succesfully added new peoduct.");
FileOutputStream fileOut;
try
{
fileOut = new FileOutputStream("products.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(p);
System.out.println("Just saved "+p.name);
productTree.add(p);
out.close();
fileOut.close();
System.out.printf("Serialized data is saved in products.ser");
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Однако я получаю java.io.EOFException
, и я не уверен, почему, поскольку у меня есть условие не получать доступ к элементу, кроме ((p = (Product) in.readObject()) != null)
. Я не уверен, как избежать EOF. Я пробовал с read()
чек, но это просто устранило бы проблему, а не помогло бы мне сохранить мои изменения. Кроме того, я заметил, что сохраняется только последний элемент, который я отправляю. Любые предложения?
EDIT После осуществления этого предложения моя ошибка переключилась на java.io.StreamCorruptedException: invalid type code: AC
.
Я читал это https://stackoverflow.com/a/2395269/4180889, но для меня непонятно, что мне делать, если я хочу сохранить контент.
я вижу логику, однако она должна быть более серьезной проблемой, так как теперь он не даже сохранить этот последний элемент. Или он не читает правильно какие-либо элементы. –
_So для меня совершенно ясно, что вы снова открываете Stream и добавляете все больше объектов проверки. Это недопустимо. Вы должны написать все объекты проверки в 'одном сеансе' ._ Я в замешательстве. –