我想要做的就是从我正在制作的应用程序中保存并更新一个包含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 []是我希望保存到内存并从内存访问的唯一对象;非常感谢任何帮助
答案 0 :(得分:0)
正如Simon的评论所指出的,可能有更好的方式(如SharedPreferences),但要回答你的问题:
在尝试打开文件之前,您应该检查该文件是否存在。例如,像(已编辑,上一个示例已被破坏):
如果(Arrays.asList(的fileList())。包含(文件名))
由于您使用Context#openFileOutput编写文件,因此应使用Context#openFileInput而不是new FileInputStream()
与该问题没有直接关系的代码的其他问题:
.close()应该在finally中,例如:
最后{ 尝试{ if(ois!= null){ ois.close(); } } catch(....