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时保存滚动位置

java [Android]返回ListView 2时保存滚动位置

将图像从android上传到java servlet并保存

如何在内部存储android java中下载和保存媒体文件