Android简易实战教程--第十五话《在外部存储中读写文件》
第七话里面介绍了在内部存储读写文件 点击打开链接。
这样有一个比较打的问题,假设系统内存不够用,杀本应用无法执行,或者本应用被用户卸载重新安装后。以前保存的用户名和密码都不会得到回显。所以,有必要注意这个问题
因此把文件保存到sd卡中。即今天所写的 第十五话《在外部存储中读写文件》
首先布局文件和第七话一样:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" android:orientation="vertical" > <EditText android:id="@+id/et_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入用户名" /> <EditText android:id="@+id/et_pass" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPassword" android:hint="请输入密码" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <CheckBox android:id="@+id/cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="记住用户名和密码" android:layout_centerVertical="true" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right" android:text="登录" android:layout_alignParentRight="true" android:onClick="login" /> </RelativeLayout> </LinearLayout>
接着是主界面的代码:
package com.itydl.rwinrom; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStreamReader; import org.apache.http.entity.InputStreamEntity; import com.itheima.rwinsd.R; import android.os.Bundle; import android.os.Environment; import android.annotation.SuppressLint; import android.app.Activity; import android.view.Menu; import android.view.View; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText et_name; private EditText et_pass; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_name = (EditText) findViewById(R.id.et_name); et_pass = (EditText) findViewById(R.id.et_pass); readAccount(); } public void readAccount(){ if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File file = new File("sdcard/info.txt"); if(file.exists()){ try { FileInputStream fis = new FileInputStream(file); //把字节流转换成字符流 BufferedReader br = new BufferedReader(new InputStreamReader(fis)); //读取txt文件里的用户名和密码 String text = br.readLine(); String[] s = text.split("##"); et_name.setText(s[0]); et_pass.setText(s[1]); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public void login(View v){ String name = et_name.getText().toString(); String pass = et_pass.getText().toString(); CheckBox cb = (CheckBox) findViewById(R.id.cb); //判断选框是否被勾选 if(cb.isChecked()){ //Environment.getExternalStorageState()获取目前sdcard的状态 //MEDIA_UNKNOWN:不能识别sd卡 //MEDIA_REMOVED:没有sd卡 //MEDIA_UNMOUNTED:sd卡存在但是没有挂载 //MEDIA_CHECKING:sd卡正在准备 //MEDIA_MOUNTED:sd卡已经挂载,可用 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ //返回一个File对象,其路径是sd卡的真实路径 File file = new File(Environment.getExternalStorageDirectory(), "info.txt"); // File file = new File("sdcard/info.txt"); FileOutputStream fos; try { fos = new FileOutputStream(file); fos.write((name + "##" + pass).getBytes()); fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } else{ Toast.makeText(this, "sd卡不可用哟亲么么哒", 0).show(); } } //创建并显示吐司对话框 Toast.makeText(this, "登录成功", 0).show(); } }
与在内存读写信息不同,sd卡的读写需要权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
运行截图如下:
点击登录,土司后。再一次进入界面。会回显数据,因为打钩把用户名和密码都保存到了sd文件中了。再打开activity界面,直接读取sd文件中的数据急了