7.手机sd卡读写案例
本节分享如何将自己的文件存到内存卡里面。
如何将自己的内存卡的已用大小和总大小取出来
sd卡的读写过程
第一步:判断你是不是给手机装了sd卡,
//在这一步对于,现在的高版本api手机好像不是那么适用,
//这是在试过oppo 和 coolpad 和魅族手机试出来的,
//可能是代码问题,或者软件问题,未解决,
第二步:判断成功了之后调用方法来获得这个sd卡的位置信息
//我的真机调试过程获得的是我的手机内部储存的信息
第三步:使用IO读写文件
//要打开sd卡的创建删除文件的权限
//打开xiangsd卡中写入文件的权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在使用io的知识
创建删除文件,以及对文件内容的更改
我是用我的coolpad做的实验,为API18
在模拟机调试时可以获得sd卡的位置
//正常的自己创建路径找到内存卡中的文件夹是可以的,这是我的coolpad的内存卡的地址
//这是我的自己用手机查看的内存卡目录 File file = new File("/storage/sdcard1/liyan.txt") //这是内部储存的地址 //虽然下面这一个是应该SD卡的位置,但真机调试时就是内部储存地址 String sdpath = Environment.getExternalStorageDirectory().getPath(); File file = new File("/storage/emulated/0/liyan.txt")
//这一行就是说,在storage目录下sdcard1目录下,创建一个liyan.txt
//经试验成功,另外想写什么地址都可以成功找到,前提是地址有效
//然后使用java中的io知识
注意,但是我们开发的环境绝对不是面向一种手机的
但是不同的手机的sd卡的位置又不尽相同所以,
我们就需要用方法获取到一个sd卡的位置
代码如下
b_save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //开始点击方法 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//判断是不是可用的sd卡 try { //这是字节流要写进去的字符串 String s = "nihao**shijie"; //这是我的coolpad的内存卡的地址 //File file = new File("/storage/sdcard1/liyan.txt"); //这是内部储存的地址 //File file = new File("/storage/emulated/0/liyan.txt"); //这是我们按理说取到的sd卡的路径 String sdpath = Environment.getExternalStorageDirectory().getPath();
//英文意思为获取外部储存目录 //这个也是按理说取到sd卡的路径,不过最后加了一个斜杠和文件的名字, //这是两种是实现方法 String location = Environment.getExternalStorageDirectory().toString()+"/"+"tao.txt"; //创建一个文件 File file = new File(location); //创建一个文件,先是地址再是文件名字 File file_2 = new File(sdpath,"huishou.txt"); //实例化 FileOutputStream fos = new FileOutputStream(file); FileOutputStream fos_2 = new FileOutputStream(file_2); //文件写入 fos.write(s.getBytes()); fos_2.write(s.getBytes()); //文件关闭 fos.close(); fos_2.close(); //总结一下,这里按照道理来讲应该是将文件保存到我们的sd卡下, //但是实际上保存的是,我手机目录之下, //为了确定我是不是写错了,我关闭了我的sd卡读写以及修改权限, //这时候就写不进去了, //这种现象表明应该是我的手机出现了问题, //!!!!!!!!!!!!!!经过调试在电脑上的虚拟机 //哑巴里,果然是这样 //吐司显示一下能够检测到了 Toast.makeText(MainActivity.this, "储存卡已经检测到了", Toast.LENGTH_SHORT).show(); //说明一下存在的位置 dm.setText("huishou.txt储存的地址是" + sdpath + "\n" + "tao储存的地址是" + location); //Toast.makeText(MainActivity.this, "储存卡可用"+sdpath+",已经储存到"+location, Toast.LENGTH_SHORT).show(); } catch (Exception e) { Toast.makeText(MainActivity.this, "抛出异常了,有可能是mainfest权限没有打开", Toast.LENGTH_SHORT).show(); e.printStackTrace(); } }else { Toast.makeText(MainActivity.this, "错误没有检测到sd卡", Toast.LENGTH_SHORT).show(); } } });
获取sd卡信息
//这些都是在oncreate哪个函数里面 //找到两个文本域用来显示 final TextView tv_total = (TextView) findViewById(R.id.tv_1); final TextView tv_useable = (TextView) findViewById(R.id.tv_2); File file = Environment.getExternalStorageDirectory();//获取外部储存目录 final long total = file.getTotalSpace(); final long useable = file.getUsableSpace(); final String ok = android.text.format.Formatter.formatFileSize(this, total); final String ok_2 = android.text.format.Formatter.formatFileSize(this,useable); //在Java中,final的作用主要有一下三个方面~ // 第一,被final修饰的类不能被继承。 // 第二,被final修饰的方法不能被重写。 // 第三,被final修饰的变量不能被重新赋值。 Button b_gett = (Button) findViewById(R.id.b_get); b_gett.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tv_total.setText(ok); tv_useable.setText(ok_2); } });
上面的formatter是,这个包里的不要搞错,老版本的eclipse这个不同
从图上看出:总大小2.10GB,还剩下0.94GB



浙公网安备 33010602011771号