ObjectOutputStream 取 BufferedOutputStream 时不写对象

ObjectOutputStream does not write objects when taking BufferedOutputStream

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

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[=11=][=11=](这与我如何更改它无关);但是如果我保持代码不变,它会用对象的引用写一些东西并且做得很好。

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

编辑:

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

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

事情是这样的:

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

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