我已经完成了研究,但似乎找不到有关该主题的足够文档。
在 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/