标签:往sdcard中读写文件 并判断sdcard的状态 以及sdcard的容量大小是否满足
上节学习了如何在手机内部存储中读写文件,本节学习如何在手机的外部存储中读写文件。那就是如何在Sdcard中读写文件。
那我们还是用以前登录界面的例子举例说明,(登录界面请看上节Android 存储学习之在内部存储中读写文件)
先我们显示写的代码:
当点击确定并且自动登录的钩是选中的,则就会在sdcard文件夹写创建一个info.txt文件
public void login(View v) { String name = ed_nam.getText().toString(); String passwd = ed_passwd.getText().toString(); //判断用户名或者密码是否输入 if((name.equals("")) || (passwd.equals(""))) { Toast.makeText(this, "用户名或密码不能为空", Toast.LENGTH_SHORT).show(); } else { //如果选中自动登录,我们就需要保存用户名和密码 if(cb.isChecked()) { //创建一个文件,用户保存用户名和密码 File file = new File("sdcard/info.txt"); try { FileOutputStream fos = new FileOutputStream(file); //写入用户名和密码,以name##passwd的格式写入 fos.write((name + "##" + passwd).getBytes()); //关闭输出流 fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show(); } } }
执行后,显示效果如下:
同理读也就是将上节读取的路径改为sdcard的路径即可:
public void readInfo() { File file = new File("sdcard/info.txt"); //如果文件存在,则读取 if(file.exists()) { try { FileInputStream fin = new FileInputStream(file); //把字节流转化为字符流 BufferedReader buffer = new BufferedReader(new InputStreamReader(fin)); //读取文件中的用户名和密码 String text = buffer.readLine(); //以##为关键字分割字符 String s[] = text.split("##"); //设置进EditText ed_nam.setText(s[0]); ed_passwd.setText(s[1]); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
//创建一个文件,用户保存用户名和密码 //File file = new File("sdcard/info.txt"); File file = new File(Environment.getExternalStorageDirectory(), "info.txt");设想一种情况,当我们往sdcard中写一个文件,但是由于sdcard容量有限,不足与放下此文件,所以在用户打算放入一个文件到sdcard中时,需要先判断存储空间是不满足,不满足请用户给予提醒即可。
那如何获得sdcard的当前可用容量:
//用户判断是否文件大小超过sdcard的容量 public Boolean sdcardAvailable(int size) { File file = Environment.getExternalStorageDirectory(); StatFs stat = new StatFs(file.getPath()); //每个块的大小 long blockSize = stat.getBlockSize(); //公共分为多少个块 long totalBlocks = stat.getBlockCount(); //共有多少可用的空间,单位为字节 long availableBlocks = stat.getAvailableBlocks(); if(availableBlocks > size) { return true; } return false; }
try { FileOutputStream fos = new FileOutputStream(file); //写入用户名和密码,以name##passwd的格式写入 //要写入的数据长度,单位是字节 int len = (name + "##" + passwd).getBytes().length/8; if(sdcardAvailable(len)) { fos.write((name + "##" + passwd).getBytes()); } else { Toast.makeText(this, "sdcard存储空间不足", Toast.LENGTH_SHORT).show(); } //关闭输出流 fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
再设想一种情况,当我们突然往sdcard中写入内容时,如果sdcard出现某些问题,没有挂载,那也是不能写入东西的。所以,读写之前需要判断sdcard是否正常运行
if(cb.isChecked()) { //创建一个文件,用户保存用户名和密码 //File file = new File("sdcard/info.txt"); /* MEDIA_CHECKING: sd卡正在准备 * MEDIA_MOUNTED:sd卡已经挂载,并且正在读写访问 * MEDIA_REMOVED:没有sd卡 * MEDIA_UNKNOWN:不能识别sd卡 * MEDIA_UNMOUNTED:sd卡存在,但没有挂载 * */ if(Environment.getExternalStorageDirectory().equals(Environment.MEDIA_MOUNTED)) { File file = new File(Environment.getExternalStorageDirectory(), "info2.txt"); try { FileOutputStream fos = new FileOutputStream(file); //写入用户名和密码,以name##passwd的格式写入 //要写入的数据长度,单位是字节 int len = (name + "##" + passwd).getBytes().length/8; if(sdcardAvailable(len)) { fos.write((name + "##" + passwd).getBytes()); } else { Toast.makeText(this, "sdcard存储空间不足", Toast.LENGTH_SHORT).show(); } //关闭输出流 fos.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show(); }
也就是在读写时,先判断sdcard是否已经正在运行,如果sdcard的状态是ok的。则执行接下来的操作即可
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:往sdcard中读写文件 并判断sdcard的状态 以及sdcard的容量大小是否满足
原文地址:http://blog.csdn.net/longwang155069/article/details/47208909