【发布时间】: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