Android Java保存到文件返回IOException

时间:2014-10-03 12:55:42

标签: java android load save

我知道可能有很多这样的事情发生(并且相信我在试图做到这一点时经历了很多)但我似乎无法实现这一目标。 我试图将自定义对象(汽车)列表保存到本地存储上的文件中,然后通过单击按钮将其加载回来。 我一直在尝试使用基于我读过的许多来源的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异常。 还要注意我有一个按钮,它将汽车添加到列表中,所以我不会保存一个空列表(虽然我不明白为什么这应该重要)。

1 个答案:

答案 0 :(得分:1)

感谢所有花时间帮助我的人。 在添加以下行之后似乎:

e.printStackTrace();

到异常捕获器并跟随logCat输出我发现Car无法序列化。一项快速研究表明,由于Car对象来自一个类(Car.java),该类必须实现'serializable'才能被序列化,然后再进行反序列化。

所以在Car.java文件中:

public class Car implements Serializable { 

我在整个过程中遇到了一个很好的解释,非常适合像我这样的新手: https://www.youtube.com/watch?v=6MisF1sxBTo