在 Android 应用程序中读取对象时出现 EOFException
Posted
技术标签:
【中文标题】在 Android 应用程序中读取对象时出现 EOFException【英文标题】:EOFException when readObject in an android app 【发布时间】:2011-09-03 19:30:15 【问题描述】:我使用序列化将数据保存在我的 android 应用程序中。一切都很顺利,直到用户报告他无法打开他的文件。 在检查了他发送给我的文件后,发现问题是 readObject() 时出现 EOFException。
我在 vim 中打开了 .ser 文件,它不是空的。它看起来和其他可以正常打开的文件一样正常。 当用户保存 .ser 文件时,不出意外。
我的问题是: 1. 一开始就使用序列化是一个错误的决定吗? 2. 我的代码在大多数情况下都能正常工作,但我可能遗漏了一些最终导致此问题的内容。 3. 用户说这个文件对他来说非常重要,所以我真的很想找到一个解决方法来打开这个文件。
下面是如何读取文件的代码:
FileInputStream f_in = null;
ObjectInputStream obj_in = null;
f_in = new FileInputStream(fileName);
obj_in = new ObjectInputStream (f_in);
mBlock = (Block)obj_in.readObject();
这是我用来保存可序列化的代码。
saveObjToFile(mBlock, mFileName);
static void saveObjToFile(Serializable object, String fileName)
throws IOException
FileOutputStream f_out = null;
ObjectOutputStream obj_out = null;
try
File note_file = new File(fileName);
f_out = new FileOutputStream(note_file);
obj_out = new ObjectOutputStream (f_out);
obj_out.writeObject(object);
obj_out.flush();
obj_out.close();
finally
if (obj_out != null)
try
obj_out.close();
catch(IOException e)
if (f_out != null)
try
f_out.close();
catch(IOException e)
这里是Block定义的代码sn-p:
public class Block implements Serializable
private static final long serialVersionUID = -4369689728261781215L;
private int mType;
private byte[] mContent;
private ArrayList<Block> mChildren = null;
//... no more attributes.
【问题讨论】:
【参考方案1】:在保存可序列化的代码中,异常在哪里处理?
我认为可以安全地假设,因为您无法读取文件,因此在写入文件时引发了异常。在我看来,如果您在遇到错误后简单地关闭输出流,您是否能够恢复文件是值得怀疑的。
【讨论】:
我检查了处理异常的代码,它捕获并忽略了 IOException。你是对的,也许提出了一个例外。但我无法想象发生了什么样的异常?下次写的时候出现IOException,问用户“重试”还是“取消”会有帮助吗?【参考方案2】:EOFException 是正常的! 它只是意味着你已经到了对象流的末尾。如果在读取第一个对象时得到它,则流中没有对象。请注意,它确实有一个对象输出流标头,否则您会遇到不同的异常,因此它不为空。只是空的对象。
【讨论】:
感谢您的解释!正如尼克指出的那样,我猜这个问题是在编写对象时发生的。以上是关于在 Android 应用程序中读取对象时出现 EOFException的主要内容,如果未能解决你的问题,请参考以下文章
当我尝试在 Android 11 中读取文件时出现电容器文件系统错误
为啥在使用 Android MediaPlayer 读取 H.264 编码的 rtsp 流时出现“不支持的格式”错误?
尝试从 MediaStore 读取时出现 Android KitKat securityException
从 InputStream 读取时出现 IOException
通过 Android 中的 Intent 反序列化 Serializable 对象时出现 ClassNotFoundException