创建 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
函数。它以覆盖模式擦除文件中的所有内容。
编辑(为了混淆):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
函数。它以覆盖模式擦除文件中的所有内容。