java - ObjectOutputStream 取 BufferedOutputStream 时不写入对象

标签 java file-io objectoutputstream

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

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

最佳答案

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

发生的情况是这样的:

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

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

关于java - ObjectOutputStream 取 BufferedOutputStream 时不写入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46587429/

相关文章:

java - 使用 DataOutputStream 时出现奇怪的输出

c - 安西 C : Attempting to count total chars in a file

java - 序列化-为什么readObject不能读取整个文件?

java - 遍历目录,读入文件,并将它们打印到 html 文件中

java - 使用 .bin 保存/加载 HashMap

JAVA编写和加载对象ArrayList

java - 对使用包编译基本的java测试程序感到困惑

java - 将 LDAP 用于 Apache Derby

java - 与 Spring 提供的 BeanUtils.copyProperties 相比,clone 方法在性能方面是否昂贵?

java - JPA 的错误(每次执行后转储数据库)?