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卡 ...
随机推荐
- Android 命令行执行工具类
最近在做android项目的时候,需要执行命令行命令,之前在网上找的不仅杂乱而且错误多,于是自己写了一份. 话不多说,直接上代码 import android.util.Log; import jav ...
- UICollectionViewCell定制Button
UICollectionViewCell定制Button 效果 特点 1.能够动态设置每行显示的按钮的个数,以及控件的摆放格式 2.实现单选或者多选的功能,实现点击事件 3.自定制按钮的显示样式 用法 ...
- Android中使用GridView和ImageViewSwitcher实现电子相册简单功能
我们在手机上查看相册时,首先看到的是网格状的图片展示界面,然后我们选择想要欣赏的照片点击进入,这样就可以全屏观看该照片,并且可以通过左右滑动来切换照片.如下图的显示效果: 首先我们先罗列一下本次实现所 ...
- IOS之Objective-C学习 策略模式
对于策略模式,我个人理解策略模式就是对各种规则的一种封装的方法,而不仅仅是对算法的封装与调用而已.与工厂模式中简单工厂有点类似,但是比简单工厂更有耦合度,因为策略模式以相同的方法调用所有的规则,减少了 ...
- SVN为什么比Git更好
首先我表明一个根本的立场,我个人更喜欢用Git,但是,这仅仅是一个个人偏好.当我们需要将一种技术方案带给整个团队的时候,并不是由我们的个人偏好作为主要决定因素,而应该充分去权衡利弊,选择对团队,对公司 ...
- 自动化集成部署udeployer 批量统一安装一键部署
通过jenkins构建项目:version版本控制:udployer自动化集成:ucop业务巡检做到高效高可用的自动化体系. 1.0版本: 逻辑与业务分离,完美实现逻辑与业务分离,业务实现统一sh ...
- MVC 后台管理框架 FineUIMvc 在线示例
FineUIMvc 在线示例 基础版下载
- Mongodb 3.2 Manual阅读笔记:CH9 存储
9. 存储 9. 存储 9.1 存储引擎 9.1.1 WiredTiger存储引擎 9.1.1.1 文档级别并发 9.1.1.2 快照和检查点 9.1.1.3 Journaling 9.1.1.4 压 ...
- css实现页面元素居中
水平居中 对于已知宽度的块级元素实现水平居中只需要设置 margin-left:auto; margin-right:auto; 对于多个块级元素实现水平居中只需要设置 //1 父类{ text-al ...
- 理解SVG的viewport,viewBox,preserveAspectRatio
万丈高楼平地起,基础很重要. viewport 表示SVG可见区域的大小,或者可以想象成舞台大小,画布大小. <svg width="500" height="30 ...