写一个简单的int []到android内存

时间:2013-11-23 22:37:52

标签: android save android-sdcard filenotfoundexception

我想要做的就是从我正在制作的应用程序中保存并更新一个包含20个高分的简单int [],但我一直在获取fileNotFoundExceptions。 我读到:https://developer.android.com/guide/topics/data/data-storage.html#filesExternal,但这并不是非常具体。

使用过的字段:

    private int[] highscores; //initialized as null in onCreate()
    private double dynamicHighScore; //calculated from intent that fires activity

代码:

    String fileName = "highscores";



    try {
        FileInputStream fis = new FileInputStream(fileName);
        ObjectInputStream ois = new ObjectInputStream(fis); //firing fileNotFoundException everytime
        this.highScores = (int[]) ois.readObject();
        Log.d("GameOver", "Object Read");
        ois.close();
        fis.close();


        if (this.highScores.length < 20) {
            int[] newHighScores = new int[this.highScores.length + 1];
            newHighScores[newHighScores.length - 1] = (int) this.dynamicScore;
            this.highScores = newHighScores;
        } else if (this.highScores[this.highScores.length - 1] < this.dynamicScore) {
            this.highScores[this.highScores.length - 1] = (int) this.dynamicScore;
        }

        int j;
        int key;
        int i;

        // insertion Sort

        for (j = 1; j < highScores.length; j++) {
            key = highScores[j];
            for (i = j - 1; (i >= 0) && (highScores[i] < key); i--) {
                highScores[i + 1] = highScores[i];
            }
            highScores[i + 1] = key;
        }

        FileOutputStream fos = openFileOutput(fileName,
                Context.MODE_PRIVATE);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(highScores);
        Log.d("GameOver", "Object rewritten");
                    oos.close();
        fos.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
        Log.d("fnf", "fnf1");
    } catch (IOException e) {
        e.printStackTrace();
        Log.d("IO", "IO1");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
        Log.d("CNF", "CNF1");
    }

    if (this.highScores == null) {
        try {
            this.highScores = new int[] { (int) this.dynamicScore };
            FileOutputStream fos = openFileOutput(fileName,
                    Context.MODE_PRIVATE);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(highScores);
            Log.d("GameOver", "Object created and written");
            oos.close();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();

        }
    }

在后续运行后的GameOver中,我无法找到该文件 我已经尝试将File对象而不是String fileName传递给新的FileInputStream(),但没有更改 我的Logcat表示正在将对象写入内存,但未在内存中找到

是否必须更明确地指定文件路径,      如果是的话,在哪里?

如果必须更明确地指定文件路径,为什么我的Logcat会成功记录对象创建和文件写入?

这个int []是我希望保存到内存并从内存访问的唯一对象;非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

正如Simon的评论所指出的,可能有更好的方式(如SharedPreferences),但要回答你的问题:

  1. 在尝试打开文件之前,您应该检查该文件是否存在。例如,像(已编辑,上一个示例已被破坏):

    如果(Arrays.asList(的fileList())。包含(文件名))

  2. 由于您使用Context#openFileOutput编写文件,因此应使用Context#openFileInput而不是new FileInputStream()

  3. 打开FileInputStream。

    与该问题没有直接关系的代码的其他问题:

    • .close()应该在finally中,例如:

      最后{   尝试{     if(ois!= null){          ois.close();     }   } catch(....