【问题标题】:A problem with java Object Streams while writing to file写入文件时 java 对象流的问题
【发布时间】:2010-08-10 12:22:25
【问题描述】:

我正在尝试将“HashMap”类型的对象写入文件并在我的程序再次运行时恢复它。但是当我尝试读取该对象并且未从文件中读取该对象时,我遇到了 EOFException。当我为 FileOutputStream 和 ObjectOutputStream 编写对象时,我使用了 flush() 和 close() 方法。我还为我的文件一起创建了 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();
            }

问候, 萨贾德

【问题讨论】:

  • 同一文件的输出流和输入流是否同时打开?这是一个好主意吗?当您尝试读取时创建一个打开的输入流,然后将其关闭。当你想写的时候创建并打开输出流,然后关闭它。

标签: java fileoutputstream


【解决方案1】:

文件似乎不完整。当我查看您的代码时,您正在创建文件 table.txt 并尝试在之后立即阅读它。

这位演员:

new FileOutputStream(tableFile)

将覆盖文件。如果你后来读它,它会是空的(除了来自OOS的头信息)

【讨论】:

  • 非常感谢。我将 OutputStreams 初始化替换为在程序结束时保存对象的方法,问题已解决。但是,OutputStreams 和 inputStreams 是否不应该同时用于一个文件以避免此类问题?
  • 是的,您应该一次只为任何单个文件打开其中一个。
【解决方案2】:

EOFException 表示文件不完整。所以要么不是flush()ed,要么不是close()ed,或者某个地方吞下了异常。

【讨论】:

  • 先生!我在代码中使用了 flush()。在关闭程序时我也使用了 close()。我看到了文件;它不是空的。
  • 你读的时候是空的,因为你刚刚创建了一个新的,还没有写入。
猜你喜欢
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多