1

私はAndroidのアプリを書いています。2つのアクティビティ。1つは「hellomessage」と入力するテキストエディット、もう1つはメッセージを内部ストレージに保存するボタンです。2番目は主な活動です。こんにちはメッセージは、アプリの起動後に表示されます。

2番目のアクティビティ:

    String s = ((EditText) findViewById(R.id.message_act_editText_hello)).getText().toString();
    FileOutputStream fos = openFileOutput(Lab2AndroidActivity.FILENAME, Context.MODE_PRIVATE);
    fos.write(s.getBytes());
    fos.close();

最初の(メイン)アクティビティ:

    static String FILENAME = "message_file.zip";
    FileOutputStream fos;
    try {
        //piece of code to guarantee that file exists
        fos = openFileOutput(Lab2AndroidActivity.FILENAME, Context.MODE_APPEND);
        fos.close();
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }


    try {
        fis = openFileInput(FILENAME);
        messageString = new StringBuffer("");
        while ((length = fis.read(buffer)) != -1) {
            String temp = new String(buffer, 0,length);
            messageString.append(temp);
            fis.close();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    Toast t = Toast.makeText(this, messageString, 3000);
    t.show();

次の行のlogcatでIO例外が発生しています。

  while ((length = fis.read(buffer)) != -1)

しかし、アプリは正しく機能しているようです(アプリの起動後に定義されたメッセージが表示されます)。説明を見つけようとしましたが、いくつかのトピックが見つかりましたが、すべてが大きなファイル、アセット内のファイル、または圧縮ファイルによるものでした。ファイルに次のような名前を付けようとしました

static String FILENAME = "message_file.zip",
static String FILENAME = "message_file.txt", 

さまざまな拡張機能を試してみますが、常に同じIO例外が発生します。

提案をありがとう。

4

2 に答える 2

0

私は理由を見つけました。問題は断片的でした:

while ((length = fis.read(buffer)) != -1) {
        String temp = new String(buffer, 0,length);
        messageString.append(temp);
        fis.close();
    }

キャッチは何ですか?

fis.close();

しばらくしてからです。昨日気づかなかった…

于 2012-05-12T11:23:39.560 に答える
0

もちろん、ファイルが終了せず、ファイルを開くように要求すると、IO例外が発生します。このコードを忘れてしまいます。

File myFile = new File("/sdcard/mysdfile.txt");

最初のアクティビティでは、このコードを使用できます

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    EditText txtData;
    Button btnWriteSDFile;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // bind GUI elements with local controls
    txtData = (EditText) findViewById(R.id.txtData);
    txtData.setHint("Enter some lines of data here...");

    btnWriteSDFile = (Button) findViewById(R.id.btnWriteSDFile);
    btnWriteSDFile.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
        // write on SD card file data in the text box
        try {
            File myFile = new File("/sdcard/mysdfile.txt");
            myFile.createNewFile();
            FileOutputStream fOut = new FileOutputStream(myFile);
            OutputStreamWriter myOutWriter = 
                                    new OutputStreamWriter(fOut);
            myOutWriter.append(txtData.getText());
            myOutWriter.close();
            fOut.close();
            Toast.makeText(getBaseContext(),
                    "Done writing SD 'mysdfile.txt'",
                    Toast.LENGTH_SHORT).show();
            Intent i = new Intent(getApplicationContext(),SecondActivity.class);
            startActivity(i);
        } catch (Exception e) {
            Toast.makeText(getBaseContext(), e.getMessage(),
                    Toast.LENGTH_SHORT).show();
        }
    }// onClick
    });
}
}

2番目のものではこれを使用できます:

public class SecondActivity extends Activity {

    private TextView txtData2;
     @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main2);
        txtData2 = (TextView) findViewById(R.id.textView2);
        try {
            File myFile = new File("/sdcard/mysdfile.txt");
            FileInputStream fIn = new FileInputStream(myFile);
            BufferedReader myReader = new BufferedReader(
                    new InputStreamReader(fIn));
            String aDataRow = "";
            String aBuffer = "";
            while ((aDataRow = myReader.readLine()) != null) {
                aBuffer += aDataRow + "\n";
            }
            txtData2.setText(aBuffer);
            myReader.close();
            Toast.makeText(getBaseContext(),
                    "Done reading SD 'mysdfile.txt'",
                    Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            Toast.makeText(getBaseContext(), e.getMessage(),
                    Toast.LENGTH_SHORT).show();
        }
    }

}

最初のlatoutは、編集テキストとボタンを含むlinearlayoutを使用します

2番目はテキストビューのみのlinearLayout

問題が見つかった場合は、問題なく動作するようにしてください。

ああ、マニフェストに追加する必要があることを忘れています

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
于 2012-05-11T16:29:45.670 に答える