我希望能够允许用户通过输入对象的信息并按下按钮来创建对象,而无需先在代码中实例化该对象。
我正在使用序列化将具有用户输入数据的对象保存在bi文件中,但是每次尝试保存新对象时,它都会覆盖它
public void addMovie2() throws IOException {
MoviesLinkedList.add(new Movies (textField.getText(), ratings.getSelectedItem(), textField_1.getText()));
Movies movie1 = new Movies(textField.getText(), ratings.getSelectedItem(), textField_1.getText());
String Filename = "MoviesLinkedList.bin";
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(Filename));
os.writeObject(movie1);
os.close();
System.out.println("Done Saving");
}
每当用户按下“添加”按钮时,我都会运行此方法。这适用于1个移动对象,每当我要保存多个对象时,它都会覆盖它。
这是我编写的用于读取JTextArea中的对象的代码:
String Filename = "MoviesLinkedList.bin";
try {
ObjectInputStream is = new ObjectInputStream(new FileInputStream(Filename));
Movies movie1 = (Movies) is.readObject();
MoviesTextArea.setText("Title: " + movie1.title + " Rating: " + movie1.rating + " Review: " + movie1.review);
is.close();
} catch (IOException e1) {
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
}
答案 0 :(得分:0)
FileOutputStream constructors中的一个具有参数append
。因此,只需使用
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(Filename, true));
要测试的代码:
public static void main(String[] args) throws IOException {
f("first");
f("second");
f("third");
}
private static void f(Object o) throws IOException {
String Filename = "MoviesLinkedList.bin";
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(Filename, true));
os.writeObject(0);
os.close();
}
答案 1 :(得分:0)
如果要使用单个ObjectInputStream读取多个对象,请使用单个ObjectOutputStream 将多个对象写入单个文件。
序列化文件不仅仅包含序列化对象的序列。每个ObjectOutputStream在您写入的对象或基元的任何序列之前都将序列化标头写入流中。将附加模式与多个FileOutputStreams一起使用将无济于事。
如果您还使用多个ObjectInputStream,则可以对单个文件使用多个ObjectOutputStream。在这种情况下,您可能还需要寻找文件中的特定位置。
顺便说一句,Java提供了一种方便的机制来确保关闭流-即使发生异常。 try-with-resources 块也需要更少的代码。
try ( ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(Filename))) {
os.writeObject(movie1);
}