Android Java保存到文件返回IOException
Posted
技术标签:
【中文标题】Android Java保存到文件返回IOException【英文标题】:Android Java saving to file returning IOException 【发布时间】:2014-10-03 12:55:42 【问题描述】:我知道周围可能有很多这样的事情(相信我,我在努力做到这一点时经历了很多),但我似乎无法做到这一点。 我正在尝试将自定义对象(汽车)列表保存到本地存储上的文件中,然后通过单击按钮将它们加载回来。 我一直在尝试使用基于我读过的许多来源的 FileOutputStream。出于某种原因,这在使用简单的字符串列表进行测试时效果很好,但是当涉及到我自己制作的对象时,我在尝试保存时不断收到 IO 异常。如果有人可以查看我的代码并告诉我我缺少什么(花了 20 多小时试图自己对这个进行排序,但没有运气)。 P.S - 保存和加载方法由工作正常的按钮调用,因此代码被忽略了。
public class Main extends Activity implements OnClickListener
public static List<Car> carList = new ArrayList<Car>();
String FILENAME = "carListFile";
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button buttonView_saveb;
Button buttonView_loadb;
buttonView_saveb = (Button)findViewById(R.id.saveb);
buttonView_loadb = (Button)findViewById(R.id.loadb);
buttonView_saveb.setOnClickListener(this);
buttonView_loadb.setOnClickListener(this);
@Override
public void onClick(View view)
switch (view.getId())
case R.id.saveb:
SaveData();
break;
case R.id.loadb:
LoadData();
break;
public void LoadData()
ArrayList<car> toReturn;
FileInputStream fis;
try
fis = openFileInput(FILENAME);
ObjectInputStream oi = new ObjectInputStream(fis);
toReturn = (ArrayList<Car>) oi.readObject();
oi.close();
catch (FileNotFoundException e)
System.out.println("Failed to load, file '"+FILENAME+"' not found");
catch (ClassNotFoundException e)
System.out.println("Failed to load from file '"+FILENAME+"', Class not found");
catch (IOException e)
System.out.println("Failed to load from file '"+FILENAME+"', I/O Exception")
// this method return io exception, no idea why
public void SaveData()
try
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream of = new ObjectOutputStream(fos);
of.writeObject(diveLog);
of.flush();
of.close();
catch (FileNotFoundException e)
System.out.println("Failed to save, file '"+FILENAME+"' not found");
catch (IOException e)
System.out.println("Failed to save to file '"+FILENAME+"', I/O Exception");
无论我做什么,都会让我遇到 IO 异常。 另请注意,我有一个将汽车添加到列表中的按钮,因此我不会保存一个空列表(尽管我不明白为什么这很重要)。
【问题讨论】:
您可以使用例如 e.printStackTrace() 查看有关错误的更多详细信息 尝试发帖Minimal, Complete, and Verifiable example。 您没有在 FileInputStream 上调用 close(),也不是在 FileOutputStream 上。您是否尝试打开已打开(但未关闭)的文件? @Giovanni 好吧,我对 java 比较陌生(老实说,现在已经正确编码了大约一个星期,但是在阅读了许多关于堆栈溢出的帖子后,我注意到关闭对象输出流也会关闭文件输出流,如果我弄错了,请告诉我,以便我解决这个问题 @CocoNess 你是绝对正确的,一旦我将这一行添加到我的异常中并按照错误日志输出,我意识到我的错误归结为 Car 是一个类对象,我有在汽车类上实现“serializble”以使其正常工作。 【参考方案1】:感谢所有花时间帮助我的人。 在添加以下行后似乎:
e.printStackTrace();
到异常捕获器并遵循 logCat 输出,我发现 Car 无法序列化。一项快速研究表明,由于 Car 对象来自一个类 (Car.java),因此该类必须实现“可序列化”才能进行序列化,然后再进行反序列化。
所以在 Car.java 文件中:
public class Car implements Serializable
我对整个过程有一个很好的解释,非常适合像我这样刚接触 java 的人: https://www.youtube.com/watch?v=6MisF1sxBTo
【讨论】:
以上是关于Android Java保存到文件返回IOException的主要内容,如果未能解决你的问题,请参考以下文章
Java / Android - 读取、操作 XML 文件并将其保存到内部存储
使用 Button 将 EditText 保存到文件 - Android、Java
java [Android]返回ListView时保存滚动位置