【问题标题】:ObjectOutputStream does not write objects when taking BufferedOutputStreamObjectOutputStream 取BufferedOutputStream 时不写对象
【发布时间】:2018-03-17 04:18:16
【问题描述】:

我已经完成了我的研究,但我似乎找不到关于该主题的足够文档。

Object streams 上尝试一些代码时,我注意到将 BufferedOutputStream 放入 ObjectOutputStream 会导致文件写得不好。为了让事情更清楚,这是我使用的代码:

public class Objectstream implements Serializable{

private static final long serialVersionUID = 1L;
public int x;

public Objectstream(){}
public Objectstream(int x){
    this.x = x;
}

public static void main(String[] args) {
    
    try(
            //ObjectOutputStream objOutStream = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("/homes/f17oudbi/Bureau/o.txt")));//1
            ObjectOutputStream objOutStream = new ObjectOutputStream(new FileOutputStream("o.txt"));//2
            ObjectInputStream objInputStream = new ObjectInputStream(new FileInputStream("o.txt"));
            
            ){
        
        Objectstream obj = new Objectstream(7);

        objOutStream.writeObject(obj);
        objOutStream.flush();

        System.out.println(((Objectstream)objInputStream.readObject()).x);

        
    }catch(EOFException e){
        e.printStackTrace();
    }
    catch(Exception e){
        e.printStackTrace();
    }
}

}

如果我删除第一行并注释第二行,则写入的 Objectstream 只会在文件中写入\AC\ED\00\00(这与我如何更改它无关);但是,如果我保持代码不变,它会使用对象上的引用编写一些内容,并且可以很好地完成工作。

有人解释为什么会这样吗?

编辑:

我收到以下异常 java.io.EOFException 指向创建 ObjectOutputStream 方法的行。

【问题讨论】:

  • 嗯,你永远不会关闭ObjectOutputStream,我怀疑这可能会导致问题。
  • 我正在使用 try-with-resources,所以我认为已经解决了。 (编辑)另外,在这两种情况下我都没有使用它,所以这一定不是问题。
  • 啊,错过了。是的,那应该可以很好地关闭它。 (如果您重新格式化代码,这将使所有内容更易于阅读......包括导入也会使其更容易重现)
  • 现在我怀疑ObjectOutputStream 实现了它自己的缓冲区,但是为什么这个选择以及如何精确地仍然在逃避我......
  • 您声称它指向调用 readObject 的行 - 这不是我所看到的。我在 ObjectInputStream 构造函数中看到了它。请使用实际的堆栈跟踪再次更新问题。

标签: java file-io objectoutputstream


【解决方案1】:

您正在尝试在您正在写入的同一文件上创建 ObjectInputStream - 您甚至从未进入 try-with-resources 块的主体。

会发生什么:

  • 创建FileOutputStream:文件为空
  • 将其包装在 BufferedOutputStream 中:文件保持为空
  • 将其包裹在ObjectOutputStream 中:OOS 将数据写入 BufferedOutputStream,但它被缓冲了
  • 创建一个FileInputStream
  • 创建一个ObjectInputStream - 尝试从输入流中读取,发现它是空的,然后抛出异常
  • 输入流已关闭
  • 输出流关闭,刷新缓冲区,然后你得到四个字节

基本上,我强烈建议您不要尝试从您正在写入的同一流中读取 - 我怀疑这是它会导致的唯一问题。

【讨论】:

  • 好吧,一定是这样,实际上当我试图阅读而不写作时,我仍然在阅读写得不好的文件,一旦我将写作和阅读完全分开,它就可以正常工作了。
猜你喜欢
  • 1970-01-01
  • 2019-08-15
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 2013-08-10
  • 2016-02-01
相关资源
最近更新 更多