[英]Can't save List<> to sd-card
以下是我將得分保存到高分時的工作。
public void save() {
try {
BufferedWriter fw = new BufferedWriter(new FileWriter(myDir
+ "/HIGHSCORE.txt"));
for (Integer i : scores) {
System.out.println(i);
fw.write(i);
fw.newLine();
fw.flush();
}
fw.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void beforeSave() {
List<String> stringReader = new ArrayList<String>();
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(myDir + "/HIGHSCORE.txt"));
String s = "";
while ((s = br.readLine()) != null) {
System.out.println("LINE: " + s + "\n");
scores.add(Integer.parseInt(s));
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我有兩種方法來保存和加載數據信息,beforeSave()我在onResume()mwthod中使用,而save()我放入了onPause()。 當我調用onStop()(關閉程序)時它會崩潰,而且我確定befoeStart()不能正常工作。 我使用Scanner類,使用方法nextInt(),但它不起作用:(。當我只保存一個分數時,它工作。我究竟做錯了什么?
PS。 現在,我可以確定是否必須使用flush(),但是在eather之前它不起作用。
//丹尼爾
改變fw.write(i);
to fw.write(i.toString());
理由:
當前,您的代碼將值以二進制格式保存到文件中,但以文本格式讀取它們。 您必須使用相同的格式來解決問題。 以文本格式保存使得閱讀highscores.txt變得更加容易,因此我提供了該解決方案。
這是我的測試代碼:
package com.me;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
public class Main extends Activity
{
private static String FILE_NAME = "HIGHSCORES.txt"; // Added this for better maintainability
private String myDir;
private List<Integer> scores;
@Override public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Folder in SD card
myDir = Environment.getExternalStorageDirectory() + "/TwoDee"; // Just a random name
// Initialize Integer list with some values
scores = new ArrayList<Integer>();
scores.add(new Integer(5));
scores.add(new Integer(9));
scores.add(new Integer(11));
// Make sure there's the file or our test crashes. I hope you have similar code elsewhere?
try
{
File folder = new File(Environment.getExternalStorageDirectory(), "TwoDee");
if (folder.exists() == false)
folder.mkdirs();
File file = new File(folder, FILE_NAME);
if (file.exists() == false)
file.createNewFile();
}
catch (Exception e)
{
System.out.println("Fail"); // Blunt :)
}
}
@Override public void onResume()
{
beforeSave();
super.onResume();
}
@Override public void onPause()
{
save();
super.onPause();
}
@Override public void onStop()
{
super.onStop();
}
public void save()
{
Log.v("TwoDee", "save...");
try
{
BufferedWriter fw = new BufferedWriter(new FileWriter(myDir + "/" + FILE_NAME));
for (Integer i : scores)
{
Log.v("TwoDee", i.toString());
fw.write(i.toString());
fw.newLine();
//fw.flush(); // This is not really needed.
}
fw.close();
} catch (FileNotFoundException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
Log.v("TwoDee", "...save");
}
public void beforeSave()
{
//List<String> stringReader = new ArrayList<String>(); // Not needed...
BufferedReader br = null;
Log.v("TwoDee", "beforeSave...");
try
{
br = new BufferedReader(new FileReader(myDir + "/" + FILE_NAME));
String s = "";
while ((s = br.readLine()) != null)
{
Log.v("TwoDee", s);
//System.out.println("LINE: " + s + "\n"); // Not needed...
scores.add(Integer.parseInt(s));
}
} catch (FileNotFoundException e1)
{
e1.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
Log.v("TwoDee", "...beforeSave");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.