1

我正在写一个Android的应用程序。两个活动,一个有 TextEdit 来输入“你好消息”,还有一个按钮来将消息保存在内部存储中。二是主要活动。你好消息应该在应用程序启动后出现。

第二个活动:

    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

当然你会得到一个 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
    });
}
}

在第二个中,您可以使用它:

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 使用包含编辑文本和按钮的线性布局

第二个只有一个文本视图的线性布局

试一试,如果你发现问题让我知道!

啊,我忘了你必须在清单中添加

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
于 2012-05-11T16:29:45.670 回答
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 回答