我已经完成了我的研究,但似乎我找不到足够的关于这个主题的文档。
在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
方法的行。
答案 0 :(得分:4)
您正在尝试在您正在写入的同一文件上创建ObjectInputStream
- 您甚至无法进入try-with-resources块的主体。
以下是发生的事情:
FileOutputStream
:文件为空BufferedOutputStream
中:文件保持空白ObjectOutputStream
中:OOS将数据写入BufferedOutputStream,但它已被缓冲FileInputStream
ObjectInputStream
- 尝试从输入流中读取,发现它为空,并抛出异常基本上,我强烈建议您不要尝试从您正在写入的同一个流中读取 - 我怀疑这是它将导致的唯一问题。