创建 FileOutputStream 对象后文件发生变化,即使没有向文件中写入任何内容

Change in file after creating FileOutputStream object even without writing anything into file

编辑(为了混淆):null 已写入文件 "abc" 和 "efg"。

在 运行 下面的代码之后,文件 "abc" 的内容发生了变化,最初是 null ,我在每次下一次执行时都会得到 EOFException :

ObjIStream = new ObjectInputStream(new FileInputStream("abc"));
M[][] objs  = (M[][]) ObjIStream.readObject();
FS.objs = objs;
ObjIStream.close();

这里,FS.objs是class类型M[][]类型FS的静态成员。

另一方面,这对文件没有影响,在执行任意次数后我没有得到任何异常:

ObjIStream = new ObjectInputStream(new FileInputStream("abc"));
M[][] objs  = (M[][]) ObjIStream.readObject();
ObjIStream.close();

编辑:我刚刚发现 class FS 中存在的问题是这种形式:

static{ 
 try { 
  ObjOStream = new ObjectOutputStream(new FileOutputStream("abc"));
  ObjOStream.close();
  ObjOStream = new java.io.ObjectOutputStream(new java.io.FileOutputStream("efg"));
  ObjOStream.close(); 
 } 
 catch (IOException ex) { } 
}

怎么会这么麻烦呢?

问题出在new FileOutputStream("abc")本身,也就是new FileOutputStream("abc", false)。它会清除文件中的所有数据,因为您不会追加任何内容。它调用 FileOutputStream.open(String name, boolean append) 这是一个 private native 函数。它以覆盖模式擦除文件中的所有内容。