Android 数据存储02之文件读写
Android文件读写
| 版本 | 修改内容 | 日期 | 修改人 | 
| V1.0 | 原始版本 | 2013/2/25 | skywang | 
| 
 | 
 | 
 | 
 | 
Android文件读写的有两种方式。一种,是通过标准的JavaIO库去读写。另一种,是通过Context提供的接口去读写。
两种方式的原理是一样的,只是API接口不同。下面分别对两种方式进行介绍。
1 通过Java IO库读写文件
当我们想读写公用的目录,如图片、提示音;或者读写外部扩展卡上的文件时,一般都选择通过Java IO库去读写。当通过Java IO库去读写文件时,一般会用到Android Enviroment的接口(如读取外部sdcard的路径、状态等)。
1.1 Android Enviroment
下面分别对Android Eviroment涉及到的函数和变量进行说明
表01_ Enviroment API接口
| Enviroment API接口 | |
| API名称 | 说明 | 
| staticFile getDataDirectory() | 获取Android的数据目录。 | 
| staticFile getDownloadCacheDirectory() | 获取的Android下载/缓存内容的目录。 | 
| staticFile getExternalStorageDirectory() | 获取Android的外部存储目录(即sdcard目录)。 | 
| staticFile getExternalStoragePublicDirectory(String type) | 获取为特定类型的文件放在顶层的公共外部存储目录。 | 
| staticString getExternalStorageState() | 获取的主要外部存储设备的当前状态(即sdcard目录的状态)。 | 
| staticFile getRootDirectory() | 获取Android的根目录。 | 
| 返回设备是否有外部存储设备的仿真。 | |
| 返回主“外部存储设备是否是可拆卸的。 | |
表02_Enviroment sdcard卡状态说明
| Enviroment 公用目录参数 | ||
| 类型 | 名称 | 说明 | 
| 标准的铃声目录 | ||
| 相机拍照或录像文件的存储目录 | ||
| 下载目录 | ||
| 电影目录 | ||
| 音乐目录 | ||
| 提示音目录 | ||
| 图片目录 | ||
| 播客目录 | ||
| 铃声目录 | ||
表03_ Enviroment sdcard卡状态说明
| Enviroment sdcard卡状态说明 | |
| 状态名称 | 说明 | 
| 非法移除状态:移除sdcard之前,没有卸载sdcard。 | |
| 检查状态:检查sdcard的有效性 | |
| 挂载状态:sdcard卡已经成功挂载。 | |
| 只读状态:sdcard已经挂载,但是是只读的。 | |
| NOFS状态:识别到sdcard卡,但无法挂载。无法挂载原因,可能是sdcard无存储介质,或者sdcard卡的文件系统与android无兼容。 | |
| 移除状态:sdcard成功移除。 | |
| 共享状态:识别到sdcard卡,但sdcard未挂载,而是作为mass storage等设备(如以u盘的方式连接到电脑上)。 | |
| 无法挂载状态:识别到sdcard卡,但无法挂载。无法挂载的原因,可能是sdcard的存储介质部分损坏。 | |
| 未挂载:识别到sdcard,但没有挂载。 | |
1.2 Android Enviroment实例
AndroidManifest.xml
<?xml version="1.0"encoding="utf-8"?>
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.yarin.Android.HelloAndroid"
android:versionCode="1"
android:versionName="1.0"> <!-- 往SDCard写入数据权限 -->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:icon="@drawable/icon"android:label="@string/app_name">
<activity android:name=".HelloAndroid"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="5" />
</manifest>
HelloAndroid.java
package com.yarin.Android.HelloAndroid; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import java.io.*;
import android.os.Environment; // 测试Enviroment环境变量
public class HelloAndroid extends Activity {
private static final String TAG = "skywang-->HelloAndroid"; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); isSdcardMounted() ;
publicDirTest() ;
enviromentAPITest() ;
} private boolean isSdcardMounted() {
String str = Environment.getExternalStorageState();
boolean ret = Environment.MEDIA_MOUNTED.equals(str); Log.d(TAG, "isSdcardMounted ret="+ret); return ret;
} private void enviromentAPITest() { Log.d(TAG, "isExternalStorageEmulated="+Environment.isExternalStorageEmulated());
Log.d(TAG, "isExternalStorageRemovable="+Environment.isExternalStorageRemovable()); File file = null;
file = Environment.getDataDirectory();
Log.d(TAG, "getDataDirectory()="+file.getPath()); file = Environment.getExternalStorageDirectory();
Log.d(TAG, "getExternalStorageDirectory()="+file.getPath()); file = Environment.getDownloadCacheDirectory();
Log.d(TAG, "getDownloadCacheDirectory()="+file.getPath()); file = Environment.getRootDirectory();
Log.d(TAG, "getRootDirectory()="+file.getPath());
} private void publicDirTest() {
File file = null;
file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS);
Log.d(TAG, "DIRECTORY_NOTIFICATIONS="+file.getPath()); file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS);
Log.d(TAG, "DIRECTORY_ALARMS="+file.getPath()); file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
Log.d(TAG, "DIRECTORY_DCIM="+file.getPath()); file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
Log.d(TAG, "DIRECTORY_DOWNLOADS="+file.getPath()); file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
Log.d(TAG, "DIRECTORY_MOVIES="+file.getPath()); file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC);
Log.d(TAG, "DIRECTORY_MUSIC="+file.getPath()); file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
Log.d(TAG, "DIRECTORY_PICTURES="+file.getPath()); file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS);
Log.d(TAG, "DIRECTORY_PODCASTS="+file.getPath()); file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES);
Log.d(TAG, "DIRECTORY_RINGTONES="+file.getPath());
}
}
打印结果如下:
D/skywang-->HelloAndroid( 3076):isSdcardMounted ret=true
D/skywang-->HelloAndroid( 3076):DIRECTORY_NOTIFICATIONS=/mnt/sdcard/Notifications
D/skywang-->HelloAndroid( 3076):DIRECTORY_ALARMS=/mnt/sdcard/Alarms
D/skywang-->HelloAndroid( 3076):DIRECTORY_DCIM=/mnt/sdcard/DCIM
D/skywang-->HelloAndroid( 3076):DIRECTORY_DOWNLOADS=/mnt/sdcard/Download
D/skywang-->HelloAndroid( 3076):DIRECTORY_MOVIES=/mnt/sdcard/Movies
D/skywang-->HelloAndroid( 3076):DIRECTORY_MUSIC=/mnt/sdcard/Music
D/skywang-->HelloAndroid( 3076):DIRECTORY_PICTURES=/mnt/sdcard/Pictures
D/skywang-->HelloAndroid( 3076):DIRECTORY_PODCASTS=/mnt/sdcard/Podcasts
D/skywang-->HelloAndroid( 3076):DIRECTORY_RINGTONES=/mnt/sdcard/Ringtones
D/skywang-->HelloAndroid( 3076):isExternalStorageEmulated=false
D/skywang-->HelloAndroid( 3076):isExternalStorageRemovable=false
D/skywang-->HelloAndroid( 3076):getDataDirectory()=/data
D/skywang-->HelloAndroid( 3076):getExternalStorageDirectory()=/mnt/sdcard
D/skywang-->HelloAndroid( 3076):getDownloadCacheDirectory()=/cache
D/skywang-->HelloAndroid( 3076):getRootDirectory()=/system
1.3 Java IO库读写实例
AndroidManifest.xml
<?xml version="1.0"encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yarin.Android.HelloAndroid"
android:versionCode="1"
android:versionName="1.0"> <!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:icon="@drawable/icon"android:label="@string/app_name">
<activity android:name=".HelloAndroid"
android:label="@string/app_name">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="5" />
</manifest>
HelloAndroid.java
package com.yarin.Android.HelloAndroid; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import java.io.*;
import android.os.Environment;
// 通过Java IO去读写文件
public class HelloAndroid extends Activity{
privatestatic final String TAG = "skywang-->HelloAndroid"; privateFile sdcardDir = Environment.getExternalStorageDirectory();
privatestatic final String TEST_FILE_NAME = "file.txt"; @Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); originalJavaIOWriteTest();
originalJavaIOReadTest();
} privateboolean isSdcardMounted() { returnEnvironment.MEDIA_MOUNTED.equals(
Environment.getExternalStorageState());
} privatevoid originalJavaIOReadTest() {
if(!isSdcardMounted())
return; try {
Filefile = new File(sdcardDir, TEST_FILE_NAME);
FileInputStream in =
new FileInputStream(file);
byte[] bb = new byte[64];
intlen=0;
while ((len=in.read(bb))!=-1) {
Log.d(TAG, "bb="+newString(bb, 0, len));
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
} private void originalJavaIOWriteTest() {
if(!isSdcardMounted())
return; try {
Filefile = new File(sdcardDir, TEST_FILE_NAME);
FileOutputStream out =
new FileOutputStream(file);
String str = "i am skywang!"; byte[] bb = str.getBytes();
for (int i=0; i<bb.length; i++)
out.write(bb[i]);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
打印结果如下:
D/skywang-->HelloAndroid( 3298): bb=i am skywang!
2 通过Context提供的接口去读写
Android的Context提供了API用来读写该Activity的私有文件;默认路径是:/data/data/<包>/files/***.***
Context提供了openFileInput()、openFileOutput()、deleteFile()等操作文件。下面简要进行说明
2.1 Context接口说明
public abstract FileInputStream openFileInput (String name)
作 用:打开Activity的私有文件,用于读数据。
参数说明:
name —— 文件名
public abstract FileOutputStream openFileOutput (String name,int mode)
作 用:打开Activity的私有文件,用于写数据。
参数说明:
name —— 文件名
mode —— 写文件的方式,有一下几种值可以选择。
MODE_APPEND:将内容以追加的方式写到文件末尾。
MODE_PRIVATE:默认的方式,创建的文件只能被本Activity所访问。
MODE_WORLD_READABLE:Android API LEVEL 17以后不建议使用。
MODE_WORLD_WRITEABLE:Android API LEVEL 17以后不建议使用。
public abstract String[] fileList ()
作 用:返回Activity私有的文件名组成的列表。
参数说明:无
public abstract boolean deleteFile (String name)
作 用:删除Activity私有的文件。
参数说明:name —— 文件名
2.2 Context实例
HelloAndroid.java
package com.yarin.Android.HelloAndroid; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import java.io.*;
import android.os.Environment; public class HelloAndroid extends Activity{
privatestatic final String TAG = "skywang-->HelloAndroid"; privatestatic final String TEST_FILE_NAME = "file.txt";
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); //读写测试
activityFileWriteTest();
activityFileReadTest(); //列出当前文件
listActivityFiles(); //删除后再列举
Log.d(TAG,"deleteFile "+TEST_FILE_NAME);
deleteFile(TEST_FILE_NAME);
listActivityFiles();
}
//fileList接口测试
privatevoid listActivityFiles() {
String[]arrStr = fileList();
for(int i=0; i<arrStr.length; i++)
Log.d(TAG,"index="+i+", file_name ="+arrStr[i]);
}
//openFileInput接口测试
privatevoid activityFileReadTest() {
try {
FileInputStream in = openFileInput(TEST_FILE_NAME);
byte[] bb = new byte[64];
int len = in.read(bb);
Log.d(TAG,"bb="+new String(bb, 0, len));
in.close();
} catch (FileNotFoundException e) {
Log.d(TAG,"read file "+TEST_FILE_NAME+" not exist!");
} catch (IOException e){
e.printStackTrace();
}
}
//openFileOutput接口测试
privatevoid activityFileWriteTest() {
try {
FileOutputStream out =openFileOutput(TEST_FILE_NAME,MODE_WORLD_READABLE);
Stringstr = "this is a activity file test.";
out.write(str.getBytes());
out.close();
} catch (FileNotFoundException e) {
Log.d(TAG,"write file "+TEST_FILE_NAME+" not exist!");
} catch (IOException e){
e.printStackTrace();
}
}
}
打印结果如下:
D/skywang-->HelloAndroid( 3414): bb=thisis a activity file test.
D/skywang-->HelloAndroid( 3414):index=0, file_name =file.txt
D/skywang-->HelloAndroid( 3414):deleteFile file.txt
文件保存路径为:/data/data/com.yarin.Android.HelloAndroid/files/file.txt
说明:不同的实例,保存路径可能不一样!
参考文件:
1,Android API文档
2,Java API文档
3,Android实现数据存储技术:http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html
Android 数据存储02之文件读写的更多相关文章
- <Android基础> (六) 数据存储 Part 1 文件存储方式
		第六章 数据存储 6.1 持久化技术 持久化技术指将内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失. 主要有三种方式用于简单地实现数据持久化功能:文件存储.S ... 
- Android数据存储方式--SharedPreferences
		Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ... 
- Android 数据存储之 SharedPreferences储存
		------------------------------------------SharedPreferences存储--------------------------------------- ... 
- Android - 数据存储 -存储文件
		Android使用的文件系统和其他平台的基本磁盘的文件系统很相似.这里将要介绍如何使用File API在Android文件系统中读写文件. File对象适合按顺序读写大量的数据.例如,适合图片文件或者 ... 
- Android - 数据存储 -存储键值对
		如果你有少量的键值数据需要存储,可以使用SharedPreferencesAPI.SharedPreferences对象指向一个包含键值对的文件并且提供了一些简单的方法来读取它们.每个SharedPr ... 
- Android数据存储:SDCard
		Android数据存储之SDCard 0.获取sd卡路径. 1.讲述 Environment 类. 2.讲述 StatFs 类. 3.完整例子读取 SDCard 内存 0.获取sd卡路径 方法一: p ... 
- Android数据存储:File
		Android数据存储之File Files:它通过FileInputStream和FileOuputStream对文件进行操作.但是在Android中,文件是一个应用程序私有的,一个应用程序无法读写 ... 
- 【Android开发日记】之入门篇(七)——Android数据存储(上)
		在讲解Android的数据源组件——ContentProvider之前我觉得很有必要先弄清楚Android的数据结构. 数据和程序是应用构成的两个核心要素,数据存储永远是应用开发中最重要的主题之一,也 ... 
- 【Android开发日记】之入门篇(八)——Android数据存储(下)
		废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基 ... 
随机推荐
- activeMQ安全配置及常见问题解决
			https://blog.csdn.net/dandan2zhuzhu/article/details/78461872 
- STM32 串口通信使用奇偶校验
			STM32串口通信如果使用奇偶校验,需要设置数据位长度为9bit USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USAR ... 
- df   -h命令卡死解决办法
			1.现象 同事突然反应说有个服务器进入/目录运行 ls -l 无反应,同时运行df -h也卡死了.如果你的机器有用到nfs请直接看第四大点. 2.分析 运行mount [conversant@sw ... 
- oracle 中 dblink 的简单使用
			oracle 中 dblink 的简单使用 dblink的作用 当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访 ... 
- 格式化输出函数:printf 那些事  (C语言)
			printf函数提供格式化输出转换 函数包含在头文件 <stdio.h> 中 #include <stdio.h> ...... 函数的原型在头文件的声明为 _CRTIMP ... 
- Orleans介绍
			一.介绍 Orleans是一个框架,提供了一个直接的方法来构建分布式高规模计算应用程序 默认可扩展 -> Orleans处理构建分布式系统的复杂性,使您的应用程序能够扩展到数百台服务器.低延迟 ... 
- ArduinoYun教程之Arduino编程环境搭建
			ArduinoYun教程之Arduino编程环境搭建 Arduino编程环境搭建 通常,我们所说的Arduino一般是指我们可以实实在在看到的一块开发板,他可以是Arduino UNO.Arduino ... 
- Linux驱动之平台设备
			<平台设备设备驱动> a:背景: 平台总线是Linux2.6的设备驱动模型中,关心总线,设备和驱动这3个实体.一个现实的Linux设备和驱动通常需要挂接在一种总线上(比如本身依附于PCI, ... 
- java自动给版本升级,遇9变0且前面一个版本加1
			/** * 自动升级版本号,版本号+1 * @param version * @return */ private String autoUpgradeVersion(String version){ ... 
- linux 下安装 RZ SZ命令 以及使用
			对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,rz是把win的文件上传到linux上 sz是吧 ... 
