Android SD卡存储
原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/Android_SDcard_store.html
一 概念
SD卡存储空间比较大,当需要存取较大的文件时,可以使用SD卡存储。
二 特点
1, 权限
SD卡进行读取工作时,和sharedPreferences存储,File存储有权限方面的区别,主要使用以下权限:
① SDCard中创建与删除文件权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
② 从SDCard中读取文件的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
③ 向SDCard中写入文件的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2, SD卡状态
对SD卡进行操作之前应该首先判断SD卡的各种状态,便于之后的操作。
① 判断SDcard是否“存在并且可以进行读写”
使用Environment类中的方法getExternalStorageState()获得SD卡状态,若得到的值为MEDIA_MOUNTED,则代表目前SD卡“存在并且可以进行读写”。
此处只列出最常用的状态判断值,还存在其他状态值,此处不列出。
3, 路径
使用以下方法可以获得SD卡存储路径,使用此路径会将文件存放到/mnt/sdcard文件夹中:
Environment.getExternalStorageDirectory();
4, 使用
对SD卡中文件的读和写所依据的原理为最常用的IO流操作,删除文件的方法采用File类的delete()方法。
三 Android实例
为充分理解以上内容,创建一个Android工程进行实践。
1 布局及功能介绍
Android的主Activity界面如下所示:

(描述的控件顺序从上到下)
第一个EditText输入要保存的内容;
第二个EditText输入要保存的文件名(注意同时写入文件的后缀);
点击第一个Button则保存文件,位置为/mnt/sdcard
第三个EditText输入要读取的文件名;
点击第二个Button则读取文件;
读取的文件内容显示在第一个TextView中;
第四个EditText输入要删除的文件名;
点击第三个Button则删除文件。
2 主要代码
①MainActivity.java
package com.example.sdcardoperation; import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity {
private EditText et_save;
private TextView tv_read;
private EditText et_save_filename;
private EditText et_read_filename;
private EditText et_delete_filename; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_save = (EditText) findViewById(R.id.et_save);
tv_read = (TextView) findViewById(R.id.tv_read);
et_save_filename = (EditText) findViewById(R.id.et_save_filename);
et_read_filename = (EditText) findViewById(R.id.et_read_filename);
et_delete_filename = (EditText) findViewById(R.id.et_delete_filename);
} //设置保存点击事件
public void save(View v) {
//获得输入框中的内容 //非空判断
if(et_save.getText() == null || et_save.getText().length() <= 0 || et_save_filename.getText() == null || et_save_filename.getText().length() <= 0) {
Toast.makeText(getApplicationContext(), "文件名和输入内容不能为空", Toast.LENGTH_SHORT).show();
}else {
//获取待保存的文件名和保存内容,均为非空
String content_save = et_save.getText().toString().trim();
String filename_save = et_save_filename.getText().toString().trim();
//判断SD卡的状态,依据状态进行不同操作
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
//说明sdcard存在且可以读写,进行文件存储
//获取文件
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath().toString().trim(),filename_save.trim());
//使用输出流写文件
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write(content_save.getBytes());
fos.close();//记得关流
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
Toast.makeText(getApplicationContext(), "SD卡不存在或状态异常,不能写入", Toast.LENGTH_SHORT).show();
} } } //设置读取点击事件
public void read(View v) {
//首先清空上次残留的内容
tv_read.setText("");
//获取要读取的文件名
//非空判断
if(et_read_filename.getText() == null || et_read_filename.getText().length() <= 0) {
Toast.makeText(getApplicationContext(), "要读取的文件名不能为空", Toast.LENGTH_SHORT).show();
}else {
//首先获取文件
String filename_read = et_read_filename.getText().toString().trim();
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath().toString().trim(),filename_read.trim());
//判断SD卡状态
if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(Environment.getExternalStorageState())) {
//判断文件是否存在
if(file.exists()) {
//如果文件存在,则进行读取
//创建输入流
try {
FileInputStream fis = new FileInputStream(file);
//开始读取数据,为了展示内容使用内存输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int len = -1;
byte[] buffer = new byte[1024];
while((len = fis.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
//读取完毕,关流
fis.close();
//将内存输出流中的数据显示到界面上
tv_read.setText(baos.toString());
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "发生异常,读取文件失败", Toast.LENGTH_SHORT).show();
e.printStackTrace();
} }else {
Toast.makeText(getApplicationContext(), "您查找的文件不存在", Toast.LENGTH_SHORT).show();
}
}else {
Toast.makeText(getApplicationContext(), "SD卡没有装载或目前状态不支持读取", Toast.LENGTH_SHORT).show();
} } } //设置删除点击事件
public void delete(View v) {
//首先获取要删除的文件名
//非空判断
if(et_delete_filename.getText() == null || et_delete_filename.getText().length() <= 0) {
Toast.makeText(getApplicationContext(), "要删除的文件名不能为空", Toast.LENGTH_SHORT).show();
}else {
//获取要删除的文件名
String filename_delete = et_delete_filename.getText().toString().trim();
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath().toString().trim(),filename_delete.trim());
//删除数据
boolean deleteFile = file.delete();
if(deleteFile) {
Toast.makeText(getApplicationContext(), "删除文件成功", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getApplicationContext(), "删除文件失败", Toast.LENGTH_SHORT).show();
} } } }
②activity_main.xml
<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"
android:gravity="right"
android:orientation="vertical"
tools:context=".MainActivity" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_hint"
/>
<EditText
android:id="@+id/et_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_hint2"
/>
<EditText
android:id="@+id/et_save_filename"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
/>
<Button
android:id="@+id/bt_save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="save"
android:textSize="12sp"
android:text="@string/text_bt_save"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_hint3"
/>
<EditText
android:id="@+id/et_read_filename"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/tv_read"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/text_read" /> </ScrollView> <Button
android:id="@+id/bt_read"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:onClick="read"
android:text="@string/text_bt_read"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tv_hint4"
/>
<EditText
android:id="@+id/et_delete_filename"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="12sp"
/>
<Button
android:id="@+id/bt_delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="12sp"
android:onClick="delete"
android:text="@string/text_bt_delete"
/> </LinearLayout>
Android SD卡存储的更多相关文章
- Android 4.0以后正确的获取外部sd卡存储目录
刚解决这个棘手的问题 找了很久,随笔记下. 网上搜索 android 获取外部sd卡存储目录 普遍都是: 1) Environment.getExternalStorageDirectory() 这个 ...
- 【Android】14.0 第14章 内部存储与外部SD卡存储—本章示例主界面
分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 Android使用的文件系统是基于Linux的文件系统,在Android应用程序中,开发人员既可以建立和访问程序自 ...
- Android SD卡创建文件和文件夹失败
原文:Android SD卡创建文件和文件夹失败 功能需要,尝试在本地sd卡上创建文件和文件夹的时候,报错,程序崩溃. 一般情况下,是忘记给予sd卡的读写权限.但是这里面权限已经给了,还是报错. 在网 ...
- Android——数据存储:手机外部存储 SD卡存储
xml <EditText android:layout_width="match_parent" android:layout_height="wrap_cont ...
- Android——FileOutputStream与openFileOutput()的区别分析【第一个用于文件存储,第二个用于SD卡存储】【转】
本文实例分析了Android编程中FileOutputStream与openFileOutput()的区别.分享给大家供大家参考,具体如下: openFileOutput() 首先给大家介绍使用文件如 ...
- Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)
本文出自:http://blog.csdn.net/dt235201314/article/details/73176149 源码下载欢迎Star(updating):https://github.c ...
- Android——SD卡工具类——SDCardUtils.java
package com.xdsjs.save.utils; /** * SD卡相关的辅助类 * Created by xdsjs on 2015/10/13. */ import java.io.Fi ...
- Android SD卡读写
package com.jredu.zuiyou.activity; import android.os.Bundle;import android.os.Environment;import and ...
- Android SD卡上文件
1. 得到存储设备的目录:/SDCARD(一般情况下) SDPATH=Environment.getExternalStorageDirectory()+"/"; 2. 判断SD卡 ...
随机推荐
- SharePoint Designer 2013 连接 Office 365 必需安装2个SP
第一个: 32位电脑安装链接:http://www.microsoft.com/downloads/details.aspx?FamilyId=278a31eb-0cf9-4b30-a670-9c9d ...
- iOS 隐藏状态栏
1.整个项目隐藏状态栏 在Targets->General->勾选中Hide status bar . 整个项目隐藏状态栏 2.单个界面隐藏状态栏,例如登录注册页面 1.首先在info.p ...
- zend studio 快捷键
复制当前行:ctrl+alt+↓ 删除当前行:Ctrl+d 行注释:Ctrl+/ 快注释(先选中要注释的代码):Ctrl+shift+/ 提示助手(方便函数等补全):alt+/ 代码格式化:Ctrl+ ...
- 【译】Spring 4 Hello World例子
前言 译文链接:http://websystique.com/spring/spring-4-hello-world-example-annotation-tutorial-full-example/ ...
- python处理json和redis hash的坑
1.使用MySQLdb读取出来的数据是unicode字符串,如果要写入redis的hash中会变成 "{u'eth0_outFlow': 2.5, u'eth1_inFlow': 3.44} ...
- Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details
thinkphp 在Apache上配置启用伪静态,重启Apache1 restart 竟然失败了,报错 Job for httpd.service failed because the control ...
- linux输入子系统(input subsystem)之按键输入和LED控制
实验现象:在控制台打印按键值,并且通过按键控制相应的LED亮灭. 1.代码 input_subsys_drv.c #include <linux/module.h> #include &l ...
- 2.lvm动态逻辑卷
Lvm动态逻辑卷 一. 基本概念 LVM 把实际的物理磁盘数据映射到一个简单而灵活的虚拟逻辑存储视图上,藉以控制磁盘资源: 也就是重新考虑了管理文件系统和卷的方法,在文件系统管 ...
- 2-sql基本操作
sql基本操作 一.Sqlplus常用命令 1.查看oracle数据库的进程 2.查看oracle数据库运行状态 3.显示实例名(数据库名) 4.用sys账户登陆到数据库 5.解锁账户scott,并登 ...
- 使用shell脚本实现ping对应IP所对应的人名
#!/bin/bash a=(张三 李四 王五 赵六) ..} do . $((${i}+)) >dev/>&;then ))"号"${a[${i}]}&quo ...