2015-12-23 38 views
0

编辑(为了混淆):null已被写入文件“abc”和“efg”。创建FileOutputStream对象后文件发生变化,即使没有写入文件

运行下面的代码,文件“ABC”改变其最初null的内容后,我在每一次执行得到EOFException类:

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

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

在另一方面,这其中有对文件没有影响,我任何被处决的人数后,没有得到任何例外:

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

编辑:我刚刚发现存在于类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) { } 
} 

它是如何烦恼吗?

+0

正如你可能已经知道的那样,阅读文件不应该改变它,并且不能改变文件本身,所以你需要向我们展示代码,这实际上是为了我们能够猜测什么可能是错误的。请显示你的文件和你的[mcve]。 –

+0

嗯,我刚刚发现我有这样的代码在FS: 'static { 尝试ObjOStream = new ObjectOutputStream(new FileOutputStream(“abc”)); ObjOStream.close(); ObjOStream = new java.io.ObjectOutputStream(new java.io.FileOutputStream(“efg”)); ObjOStream.close(); } catch(IOException ex){ } }' –

+0

是的,这是麻烦,但它是如何令人烦恼? –

回答

0

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