在使用BufferedOutputStream时,ObjectOutputStream不会写入对象

时间:2017-10-05 13:53:23

标签: java file-io objectoutputstream

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

Object streams上尝试一些代码时,我注意到在 ObjectOutputStream 中放置 BufferedOutputStream 会导致文件 ill-写入。只是为了让事情变得更清楚,这是我用过的代码:

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方法的行。

1 个答案:

答案 0 :(得分:4)

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

以下是发生的事情:

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

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