Невозможно сохранить список <> на SD-карту - PullRequest
1 голос
/ 16 ноября 2011

Вот что я делаю, когда сохраняю свой счет в рекорд.

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();
    }
}

У меня есть два метода для сохранения и загрузки информации о данных, перед тем, как я использую в onResume () mwthod, перед сохранением () я добавлю в onPause () функцию save (). Он вылетает, когда я вызываю onStop () (закрываю программу), и я заранее уверен, что befoeStart () не сработает. Я использовал класс Scanner, чтобы использовать метод nextInt (), но он не работает :(. И когда я просто сохраняю один счет, он работает. Что, черт возьми, я делаю неправильно?

PS. Теперь я уверен, что мне нужно использовать flush (), но до этого он не работает.

// Daniel

1 Ответ

3 голосов
/ 16 ноября 2011

Изменить fw.write(i); на 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");
    }
}
...