原创文章,转载请注明出处: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卡存储的更多相关文章

  1. Android 4.0以后正确的获取外部sd卡存储目录

    刚解决这个棘手的问题 找了很久,随笔记下. 网上搜索 android 获取外部sd卡存储目录 普遍都是: 1) Environment.getExternalStorageDirectory() 这个 ...

  2. 【Android】14.0 第14章 内部存储与外部SD卡存储—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 Android使用的文件系统是基于Linux的文件系统,在Android应用程序中,开发人员既可以建立和访问程序自 ...

  3. Android SD卡创建文件和文件夹失败

    原文:Android SD卡创建文件和文件夹失败 功能需要,尝试在本地sd卡上创建文件和文件夹的时候,报错,程序崩溃. 一般情况下,是忘记给予sd卡的读写权限.但是这里面权限已经给了,还是报错. 在网 ...

  4. Android——数据存储:手机外部存储 SD卡存储

    xml <EditText android:layout_width="match_parent" android:layout_height="wrap_cont ...

  5. Android——FileOutputStream与openFileOutput()的区别分析【第一个用于文件存储,第二个用于SD卡存储】【转】

    本文实例分析了Android编程中FileOutputStream与openFileOutput()的区别.分享给大家供大家参考,具体如下: openFileOutput() 首先给大家介绍使用文件如 ...

  6. Android 存储(本地存储 SD卡存储 SharedPreference SQLite ContentProvider)

    本文出自:http://blog.csdn.net/dt235201314/article/details/73176149 源码下载欢迎Star(updating):https://github.c ...

  7. Android——SD卡工具类——SDCardUtils.java

    package com.xdsjs.save.utils; /** * SD卡相关的辅助类 * Created by xdsjs on 2015/10/13. */ import java.io.Fi ...

  8. Android SD卡读写

    package com.jredu.zuiyou.activity; import android.os.Bundle;import android.os.Environment;import and ...

  9. Android SD卡上文件

    1. 得到存储设备的目录:/SDCARD(一般情况下) SDPATH=Environment.getExternalStorageDirectory()+"/"; 2. 判断SD卡 ...

随机推荐

  1. Stimulsoft入门视频

    .NET框架下最全面的报表解决方案,支持多种报表导出格式,拥有简单且强大的报表引擎.本系列教程适合Stimulsoft Reports上手入门. 001     Stimulsoft Reports. ...

  2. Android 手机卫士--参照文档编写选择器

    本文来实现<Android 手机卫士--导航界面1的布局编写>中的图片选择器部分的代码. 本文地址:http://www.cnblogs.com/wuyudong/p/5944356.ht ...

  3. 【代码笔记】iOS-用户发布后能保存崩溃

    一,工程图. 二,代码. AppDelegate.m #import "AppDelegate.h" #import "RootViewController.h" ...

  4. js的replace函数入参为function时的疑问

    近期在写js导出excel文件时运用到replace方法,此处详细的记录下它各个参数所代表的的意义. 定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式 ...

  5. 从零自学Hadoop系列索引

    本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 从零自学Hadoop(01):认识Hadoop ...

  6. Tomcat 服务应用

    转自:http://wiki.jikexueyuan.com/project/tomcat/windows-service.html Tomcat8 是一个服务应用,能使 Tomcat 8 以 Win ...

  7. [Hadoop]-从数据去重认识MapReduce

    这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的Hadoop了.看了官网的教程[吐槽一下,果然英语还是很重要!],嗯啊,一知半解地搭建了本地和伪分布式的, ...

  8. Usual tiny skills & solutions

    Ubuntu and Win10 - double OS 2016-02-21 Yesterday I helped my friend install Ubuntu (14.04 LTS) on h ...

  9. [bzoj3207][花神的嘲讽计划Ⅰ] (字符串哈希+主席树)

    Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天D ...

  10. java url encoder 的一个问题

    @RequestMapping(value = {"/search"}) public String errorPath(HttpServletResponse response, ...