Проблема с java Object Streams при записи в файл

Я пытаюсь записать объект типа «HashMap» в файл и восстановить его, когда моя программа снова запустится. Но я столкнулся с EOFException, когда пытаюсь прочитать этот объект, а объект не читается из файла. Я использую методы flush() и close(), когда писал объект для FileOutputStream и ObjectOutputStream. Также я создаю OutputStream и InputStream вместе для своего файла. вот мой код:

DataOutputStream outToFile;
DataInputStream inFromFile;

ObjectOutputStream writeTableToFile;
ObjectInputStream readTableFromFile;
File tableFile;

public DNS(){
    try {
        tableFile = new File("table.txt");
        outToFile = new DataOutputStream(new FileOutputStream(tableFile) );
        writeTableToFile = new ObjectOutputStream(outToFile);

        inFromFile = new DataInputStream(new FileInputStream(tableFile));
        readTableFromFile = new ObjectInputStream(inFromFile);
        HashMap table2 = (HashMap) readTableFromFile.readObject();
        if (table2 == null)
            table=new HashMap(100);
        else
            table = table2;
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }catch(EOFException e){
        table=new HashMap(100);
    }
    catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }

}

и вот код для записи объекта:

            table.put(NameField.getText(), IPField.getText());
            try {
                //writeTableToFile.reset();
                writeTableToFile.writeObject(table);
                writeTableToFile.flush();
            } catch (IOException e1) {
                e1.printStackTrace();
            }

С уважением, Саджад


person sajad    schedule 10.08.2010    source источник
comment
Открыты ли одновременно поток вывода и поток ввода в один и тот же файл? Это хорошая идея? Создайте открытый входной поток при попытке чтения, а затем закройте его. Создайте и откройте поток вывода, когда вы хотите писать, а затем закройте его.   -  person Java Drinker    schedule 10.08.2010


Ответы (2)


Файл кажется неполным. Когда я смотрю на ваш код, вы создаете файл table.txt и сразу после этого пытаетесь его прочитать.

Этот ктор:

new FileOutputStream(tableFile)

перезапишет файл. Если вы прочитаете его позже, он будет пустым (кроме информации заголовка из OOS)

person Ulf Jaehrig    schedule 10.08.2010
comment
Тогда спасибо. Я заменил инициализации OutputStreams на метод, который сохраняет объект в конце программы, и проблема была решена. Но правда ли, что OutputStreams и inputStreams не следует использовать одновременно в одном месте для файла, чтобы избежать таких проблем? - person sajad; 10.08.2010
comment
Да, вы всегда должны открывать только один из них для любого отдельного файла одновременно. - person Aaron Digulla; 10.08.2010

EOFException означает, что файл неполный. Так что это либо не flush()ed, либо не close()ed, либо где-то проглочено исключение.

person Aaron Digulla    schedule 10.08.2010
comment
Мистер! Я использовал flush() в своем коде. также при закрытии программы я использовал close(). Я видел файл; это не пусто. - person sajad; 10.08.2010
comment
Он был пуст, когда вы его читали, потому что вы только что создали новый и еще не написали в него. - person user207421; 11.08.2010