ObjectOutputStream 取 BufferedOutputStream 时不写对象
ObjectOutputStream does not write objects when taking BufferedOutputStream
我已经进行了研究,但似乎找不到关于该主题的足够文档。
在 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[=11=][=11=]
(这与我如何更改它无关);但是如果我保持代码不变,它会用对象的引用写一些东西并且做得很好。
有人能解释为什么会这样吗?
编辑:
我得到以下异常 java.io.EOFException
指向创建 ObjectOutputStream
方法的行。
您正在尝试在您正在写入的同一个文件上创建 ObjectInputStream
- 您甚至从未进入 try-with-resources 块的主体。
事情是这样的:
- 创建
FileOutputStream
:文件为空
- 将其包装在
BufferedOutputStream
中:文件保持为空
- Wrap it in
ObjectOutputStream
:OOS写数据到BufferedOutputStream,但是是buffered
- 创建
FileInputStream
- 创建一个
ObjectInputStream
- 尝试从输入流中读取,发现它为空,然后抛出异常
- 输入流已关闭
- 输出流关闭,刷新缓冲区,然后你得到四个字节
基本上,我强烈建议您不要尝试从您正在写入的同一个流中读取 - 我怀疑这是它会导致的唯一问题。
我已经进行了研究,但似乎找不到关于该主题的足够文档。
在 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[=11=][=11=]
(这与我如何更改它无关);但是如果我保持代码不变,它会用对象的引用写一些东西并且做得很好。
有人能解释为什么会这样吗?
编辑:
我得到以下异常 java.io.EOFException
指向创建 ObjectOutputStream
方法的行。
您正在尝试在您正在写入的同一个文件上创建 ObjectInputStream
- 您甚至从未进入 try-with-resources 块的主体。
事情是这样的:
- 创建
FileOutputStream
:文件为空 - 将其包装在
BufferedOutputStream
中:文件保持为空 - Wrap it in
ObjectOutputStream
:OOS写数据到BufferedOutputStream,但是是buffered - 创建
FileInputStream
- 创建一个
ObjectInputStream
- 尝试从输入流中读取,发现它为空,然后抛出异常 - 输入流已关闭
- 输出流关闭,刷新缓冲区,然后你得到四个字节
基本上,我强烈建议您不要尝试从您正在写入的同一个流中读取 - 我怀疑这是它会导致的唯一问题。