Как проверить, содержит ли файл объект? - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь добавить объекты (имена людей, номера телефонов и т. Д.) В файл и затем читать его.Когда я запускаю программу и добавляю в файл несколько объектов, только первый объект содержит заголовок, а после первого - нет, чего я и хочу.

Однако, если я закрою программуи затем повторно запустите его, предыдущие объекты все еще там и функционируют, но если я добавляю новый объект в файл, программа обрабатывает его как «первый объект», поэтому выдает ему заголовок, который вызывает ошибку при попытке программычтобы прочитать информацию, хранящуюся в объекте.

Это мой код "добавить в файл":

try {
        FileOutputStream fos = new FileOutputStream("outputfile.ser", true);
        oos = new ObjectOutputStream(fos);
    }
    catch (NotSerializableException e1) {
        System.out.println("An object was not serializable, it has not been saved.");
        e1.printStackTrace();
    }
    catch (IOException e1) {
        e1.printStackTrace();
    }


    JButton btnAddContact = new JButton("Add Contact");
    btnAddContact.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

                Address newContact = new Address(firstNameTextField.getText(), lastNameTextField.getText(), homePhoneNumberTextField.getText(), mobilePhoneNumberTextField.getText(), addressTextArea.getText(), emailTextField.getText());

                try {
                    oos.writeObject(newContact);
                }
                catch (IOException e1) {
                    System.out.println("An object was not serializable, it has not been saved.");
                    e1.printStackTrace();
                }

            dispose();
            firstNameTextField.setText("");
            lastNameTextField.setText("");
            homePhoneNumberTextField.setText("");
            mobilePhoneNumberTextField.setText("");
            addressTextArea.setText("");
            emailTextField.setText("");
        }
    });
    btnAddContact.setBounds(165, 384, 110, 46);
    contentPane.add(btnAddContact);

Я также подумал, что если я проверил, если файл пуст или не использует if (file.length() == 0) будет работать, но все равно не работает.Пример моего кода с этим реализованным:

File file = new File("outputfile.ser");
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
ObjectOutputStream oas = AppendingObjectOutputStream(new FileOutputStream(file, true));
if (file.length() == 0){
                    try {
                        oos.writeObject(newContact);
                    }
                    catch (IOException e1) {
                        System.out.println("An object was not serializable, it has not been saved.");
                        e1.printStackTrace();
                    }
                } else {
                    try {
                        oas.writeObject(newContact);
                    }
                    catch (IOException e1) {
                        System.out.println("An object was not serializable, it has not been saved.");
                        e1.printStackTrace();
                    }
                }

public class AppendingObjectOutputStream extends ObjectOutputStream {

    public AppendingObjectOutputStream(OutputStream oas) throws IOException {
        super(oas);
    }

    protected void writeStreamHeader() throws IOException {
        // do not write a header, but reset:
        reset();
    }
}

Есть ли способ решить эту проблему?

1 Ответ

0 голосов
/ 20 сентября 2018

Ваш первый FileOutputStream fos = new FileOutputStream(file); перезапишет любой существующий файл.

Попробуйте сначала изменить его FileOutputStream fos = new FileOutputStream(file, true);.

Но я не рекомендую одновременно открывать тот же файл.Вы, вероятно, должны переработать логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...