一、保存到手机内存

1. 很多时候我们的软件需要对处理后的数据进行存储或再次访问。Android为数据存储提供了多种方式,分别有如下几种

l 文件(采用IO数据流的方式)

l SharedPreferences

l SQLite数据库

l 内容提供者(Content provider)

l 网络

2.使用文件进行数据存储

1).首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。

public class FileActivity extends Activity {

@Override public void onCreate(Bundle savedInstanceState) {

...

FileOutputStream outStream = this.openFileOutput("itcast.txt", Context.MODE_PRIVATE);

outStream.write("传智播客".getBytes());

outStream.close();

}

}

2). OpenFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如: /data/data/cn.itcast.action/files/itcast.txt ,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data/<package name>/files目录就可以看到该文件。

3). openFileOutput()方法的第二参数用于指定操作模式,有四种模式分别为:

Context.MODE_PRIVATE = 0,即此表达式相当于整型常量0

Context.MODE_APPEND = 32768,即、、、、整型常量32768

Context.MODE_WORLD_READABLE = 1,即此表达式、、整型常量1

Context.MODE_WORLD_WRITEABLE = 2,即此表达式相当于、、2

Context.MODE_PRIVATE为默认操作模式,代表该文件是私有数据,只能被应用本身访问(即本包内的文件)在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND

Context.MODE_APPEND与私有模式相同的是:也只能被应用本身访问(即本包内的文件),模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。.

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;

DE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入,而且是类似于私有模式的,即新写入的覆盖原有的

如果希望文件被其他应用读和写,可以传入:

openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);由上面可知,这个两个常量相加可以写成3.这种相加的操作模式也是覆盖类型。

3. android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。

4. 读取文件内容

如果要打开存放在/data/data/<package name>/files目录应用私有的文件,可以使用Activity提供openFileInput()方法。

FileInputStream inStream = this.getContext().openFileInput("itcast.txt");

Log.i("FileTest", readInStream(inStream));

readInStream()的方法:

public static String readInStream(FileInputStream inStream){

try {

ByteArrayOutputStream outStream = new ByteArrayOutputStream();

byte[] buffer = new byte[1024];

int length = -1;

while((length = inStream.read(buffer)) != -1 ){

outStream.write(buffer, 0, length);

}

outStream.close();

inStream.close();

return outStream.toString();

} catch (IOException e) {

Log.i("FileTest", e.getMessage());

}

return null;

}

或者直接使用文件的绝对路径:

File file = new File("/data/data/cn.itcast.action/files/itcast.txt");

FileInputStream inStream = new FileInputStream(file);

Log.i("FileTest", readInStream(inStream));

注意:上面文件路径中的“cn.itcast.action”为应用所在包,当你在编写代码时应替换为你自己应用使用的包。

对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。

Activity还提供了getCacheDir()和getFilesDir()方法:

getFilesDir()方法是上下文对象提供的,用于获取当前包下的应用files文件,即/data/data/<package name>/files目录。

getCacheDir()方法用于获取/data/data/<package name>/cache目录,与上面一样,只是这个是用来获取cache文件,cache是用来保存缓冲文件的,原来不存在,用到的时候被创建。

5. 在签名一致的情况下,包名是唯一标识应用的标志,如果包名也一样,则是同一应用。

权限(permission)单个标识的含义:-代表文件,d代表目录,w带你写,r代表读;

权限(permission)多个标识的含义:-rw-:第三个-代表运行,即读写读可以运行;

二、保存到SDcard

1. SDCard是干什么的?你可以把它看作是移动硬盘或U盘。

使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在SDCard。

在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下:

在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀可以随便取,建议使用.img:mksdcard 2048M D:\AndroidTool\sdcard.img

2. 在程序中访问SDCard,你需要申请访问SDCard的权限。

在AndroidManifest.xml中加入访问SDCard的权限如下:

<!-- 在SDCard中创建与删除文件权限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!-- 往SDCard写入数据权限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

3.要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。

注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限

判断sd是否存在,并且是否可以写入文件

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录

File saveFile = new File(sdCardDir, “itcast.txt”);

FileOutputStream outStream = new FileOutputStream(saveFile);

outStream.write("传智播客".getBytes());

outStream.close();

}

Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。

Environment.getExternalStorageDirectory()方法用于获取SDCard的目录,当然要获取SDCard的目录,你也可以这样写:

File sdCardDir = new File("/sdcard"); //获取SDCard目录

File saveFile = new File(sdCardDir, "itcast.txt");

//上面两句代码可以合成一句: File saveFile = new File("/sdcard/itcast.txt");

FileOutputStream outStream = new FileOutputStream(saveFile);

outStream.write("传智播客test".getBytes());

outStream.close();

最好用Environment.getExternalStorageDirectory()方法获取sd的路径,因为Android的版本不同sd的路径也不同,比如:2.1版本以前的的sd路径不是/mnt/sdcard而是/sdcsrd.即根路径

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. drawable不同目录你会怎么选择(Android)
  6. 安装android studio报错Failed to install Intel HAXM的解决方法
  7. Android(安卓)通知栏Notification的整合 全面学习
  8. 基于 Distcc 的android分布式编译环境的搭建
  9. AndroidUnity项目嵌入有米广告注意

随机推荐

  1. android 横竖屏切换问题解决方案
  2. 关于Google Android,第一印象
  3. 新手android 开发 错误集锦(持续更新中)
  4. android 取现在时间和以前的时间做差 求
  5. android HorizontalScrollView讲解
  6. Android(安卓)APK多个ICON入口
  7. android 按键
  8. Android(安卓)本地代码中的LIKELY和UNLIK
  9. 利用BLCR加快Android的启动过程
  10. Android启动画面实现