0

私は小さなゲームをプログラミングしていて、SDカードにスコアとボリューム(有効または無効)を保存したいのですが、2つの関数のコードは次のとおりです。

public static void load(FileIO files) {
    BufferedReader in = null;
    try {
        in = new BufferedReader(new InputStreamReader(
                files.readFile(".save")));
        soundEnabled = Boolean.parseBoolean(in.readLine());
        for (int i = 0; i < 5; i++) {
            highscores[i] = Integer.parseInt(in.readLine());
        }
    } catch (IOException e) {
        // :( It's ok we have defaults
    } catch (NumberFormatException e) {
        // :/ It's ok, defaults save our day
    } finally {
        try {
            if (in != null)
                in.close();
        } catch (IOException e) {
        }
    }
}

// -----------------------

public static void save(FileIO files) {
    BufferedWriter out = null;
    try {
        out = new BufferedWriter(new OutputStreamWriter(
                files.writeFile(".save")));
        out.write(Boolean.toString(soundEnabled));
        for (int i = 0; i < 5; i++) {
            out.write(Integer.toString(highscores[i]));
        }

    } catch (IOException e) {
    } finally {
        try {
            if (out != null)
                out.close();
        } catch (IOException e) {
        }
    }
}

プログラムの実行中、このコードは問題ありませんが、デバイスを再起動するとスコアが失われます。理由を知っていますか?

ありがとう!!

ps:FileIOクラスは次のとおりです。

  public class AndroidFileIO implements FileIO {
    Context context;
    AssetManager assets;
    String externalStoragePath;

    public AndroidFileIO(Context context) {
       this.context = context;
       this.assets = context.getAssets();
       this.externalStoragePath = Environment.getExternalStorageDirectory()
            .getAbsolutePath() + File.separator;
    }

    public InputStream readAsset(String fileName) throws IOException {
       return assets.open(fileName);
    }

    public InputStream readFile(String fileName) throws IOException {
       return new FileInputStream(externalStoragePath + fileName);
    }

    public OutputStream writeFile(String fileName) throws IOException {
       return new FileOutputStream(externalStoragePath + fileName);
    }

    public SharedPreferences getPreferences() {
       return PreferenceManager.getDefaultSharedPreferences(context);
    }
 }
4

2 に答える 2

1

ここには2つの問題があります。まず、out.writeは各呼び出しの最後に改行を挿入しません。手動で挿入する必要があります。つまり、calでreadlineを実行してブール値を解析すると、ファイル内のすべてのデータを実際に消費していることになります。次に、バッファにデータを残さないように、関数を終了する前にファイルをフラッシュして閉じる必要があります。

動作するはずのsaverewrittenを次に示します。

public static void save(FileIO files) {
BufferedWriter out = null;
try {
    out = new BufferedWriter(new OutputStreamWriter(
            files.writeFile(".mrnom")));
    out.write(Boolean.toString(soundEnabled));
    out.write("\n");
    for (int i = 0; i < 5; i++) {
        out.write(Integer.toString(highscores[i]));
        out.write("\n");

    }
    out.flush();
    out.close();
} catch (IOException e) {
} finally {
    try {
        if (out != null)
            out.close();
    } catch (IOException e) {

    }
}
}
于 2012-08-07T16:37:57.277 に答える
0

私は初めてプログラミングをしていますが、ivは共有設定を使用してこれを解決しました。そうすれば、アプリの更新時にデータが失われるのを防ぐことができます。

于 2012-08-14T23:16:57.863 に答える