gpt4 book ai didi

java - ObjectOutputStream 取 BufferedOutputStream 时不写入对象

转载 作者:行者123 更新时间:2023-12-01 17:54:17 27 4
gpt4 key购买 nike

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com