1

ユーザーがいくつかのテキストフィールドに数値情報を入力するアプリを開発しています。アプリは、後で使用するために情報を txt ファイルに書き込むことになっています。ユーザーが必要に応じて数値を変更できるように、数値をファイルから読み取り、同じテキスト フィールドにロードする必要があります。「ライター」機能と「ローダー」機能の両方が機能しているように見えますが、問題は、「ローダー」が呼び出されるたびに、「ライター」によって現在作成されているファイルではなく、以前に保存されたファイルからデータをロードすることです。 "。ユーザーが新しく保存したデータをテキスト フィールドにロードする場合は、アプリを閉じて再度開く必要があります。状況をよりよく説明するために、コードの後に​​いくつかのシナリオを配置しました。何が間違っていて、何ができるのでしょうか?

情報をファイルに入れるために使用しているコードは次のとおりです。正常に動作します。

    public void writer(View view){                               
    try {

        FileOutputStream fos = openFileOutput("myfilename", Context.MODE_WORLD_WRITEABLE | Context.MODE_WORLD_READABLE);
        PrintStream prntst = new PrintStream(fos);
        txtEditor=(EditText)findViewById(R.id.editText1);
        prntst.println (txtEditor.getText().toString());
        txtEditor=(EditText)findViewById(R.id.EditText02);
        prntst.println (txtEditor.getText().toString());   
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }       
}

そして、これがファイルからいくつかのArrayListに情報を読み取るために使用しているコードです。次に、このArrayListを使用してテキストフィールドを埋めます。これも正常に機能しています(エラーなしでうまくいくことを意味します):

    public void reader(View view){
    try {

        BufferedReader inputReader = new BufferedReader(new InputStreamReader(openFileInput("myfilename")));            
        Scanner scanner = new Scanner(inputReader);     
        while (scanner.hasNextLine()) {             
              String line = scanner.nextLine();
              bld.add(line);
            }

        inputReader.close();
        scanner.close();
        txtEditor=(EditText)findViewById(R.id.editText1);
        txtEditor.setText(bld.get(0));          
        txtEditor=(EditText)findViewById(R.id.EditText02);
        txtEditor.setText(bld.get(1));


    } catch (IOException e) {
        e.printStackTrace();            
        txtEditor=(EditText)findViewById(R.id.editText1);
        bld.add((txtEditor.getText().toString()));
        txtEditor=(EditText)findViewById(R.id.EditText02);
        bld.add((txtEditor.getText().toString()));           
    }
}

シナリオ:

  1. ユーザーがアプリを開き、テキスト フィールド (2 つのテキスト フィールド) にいくつかの既定値があり、ユーザーは値をそれぞれ 2 と 3 に変更し、保存ボタンをタッチします。
  2. ユーザーは値を再度変更しますが、保存ボタンに触れる代わりにロード ボタンを押すと、アプリは 2 と 3 をフィールド (保存されている) にロードすることになっていますが、代わりにデフォルト値をロードします。
  3. ユーザーがアプリを閉じて再度開くと、今回は 2 と 3 がテキストフィールドのデフォルトとして表示されます。「ローダー」が以前に保存されたファイルからデータを読み取っているようです。
  4. ユーザーは値を「2 と 3」から「13 と 14」に変更し、それぞれ保存ボタンと読み込みボタンを押しますが、2 と 3 はフィールドに読み込まれます。
  5. ユーザーがアプリを閉じて再度開くと、今回は 13 と 14 が表示されます。

PS。変数 bld はグローバルであり、MainActivity で定義されています。

    ArrayList<String> bld = new ArrayList<String>();

ありがとうございました、

4

2 に答える 2

1

writer メソッドでは、ファイル出力ストリームを閉じています:

fos.close();

ただし、代わりに印刷ストリームを閉じる必要があります。

prntst.close();

印刷ストリームを閉じると、ストリームがフラッシュされ、基になる出力ストリームが閉じられます。出力ストリームを閉じると、その上に構築された印刷ストリームについて何も知らないため、それをフラッシュすることはわかりません。

于 2013-06-04T15:39:45.363 に答える