FileInputStream.read中的IO异常。 Android的

时间:2012-05-11 15:48:40

标签: android ioexception fileinputstream

我正在写一个Android的应用程序。两个活动,一个用TextEdit键入'hello message',另一个用于在内部存储中保存消息。第二是主要活动。应用程序启动后应该出现Hello mesage。

第二项活动:

    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 Exception:

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

但应用程序似乎正常工作(应用程序启动后会显示已定义的消息)。我试图找到解释,我发现了几个主题,但都是根据大文件,资产中的文件或压缩文件。  我试着将我的文件命名为

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

尝试不同的扩展,但总是得到相同的IO异常。

感谢您的建议。

2 个答案:

答案 0 :(得分: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使用包含edittext和按钮

的linearlayout

第二个只有textview的linearLayout

如果您发现问题请尝试使用,请告诉我!!

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

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

答案 1 :(得分:0)

我找到了理由。问题出在片段中:

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

有什么问题?

fis.close();

应该在之后。我昨天没注意到......