以下代码生成EOFException
。那是为什么?
public static Info readInfoDataFromFile(Context context) {
Info InfoData = null;
FileInputStream fis = null;
ObjectInputStream ois = null;
Object object = null;
if (context.getFileStreamPath("InfoFile.dat").exists()) {
try {
fis = context.openFileInput("InfoFile.dat");
ois = new ObjectInputStream(fis);
Object temp;
try {
// here it throws EOF exception in while loop
while ((temp = ois.readObject()) != null) {
object = temp;
}
} catch (NullPointerException npe) {
npe.printStackTrace();
} catch (EOFException eof) {
eof.printStackTrace();
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ois != null) {
ois.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
堆栈跟踪:
03-07 14:29:01.996: WARN/System.err(13984): java.io.EOFException
03-07 14:29:01.996: WARN/System.err(13984): at java.io.DataInputStream.readByte(DataInputStream.java:131)
03-07 14:29:01.996: WARN/System.err(13984): at java.io.ObjectInputStream.nextTC(ObjectInputStream.java:628)
03-07 14:29:01.996: WARN/System.err(13984): at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:907)
03-07 14:29:01.996: WARN/System.err(13984): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2262)03-07 14:29:01.996: WARN/System.err(13984): at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2217)
03-07 14:29:01.996: WARN/System.err(13984): at
答案 0 :(得分:9)
取决于您的文件包含多少个对象。如果它只有一个对象,则可以一步反序列化。
try {
Object temp = ois.readObject();
}
catch(Exception e) {
//handle it
}
答案 1 :(得分:7)
首先,如果您在创建流时向流写入readObject()
,null
仅返回null
。如果流中没有更多数据,则会抛出EOFException
。
如果您不期望EOF,原因可能是流已损坏。如果您在向其写入数据后忘记关闭它,就会发生这种情况。
答案 2 :(得分:5)
我有同样神秘的EOFException
,只有对象类的路径才能通过ObjectOutputStream
发送到ObjectInputStream
。它们必须具有相同的路径(相同的包名称,当然还有相同的类名)。
答案 3 :(得分:2)
readObject()
上ObjectInputStream
的定义并未指定在到达流末尾时它将返回null
。相反,如果您尝试读取超出文件末尾的其他对象,则抛出异常。
答案 4 :(得分:0)
我收到此错误,是因为使用OutputStream.write()
编写了int
,而使用InputStream.readInt()
读取了
但是,OutputStream.write
根据文档编写了 byte
(put接受int
作为参数),因此,我需要使用{{ 1}}。