android学习日记13--数据存储之File存储

4、文件存储File
  File即传统的I/O 流存储文件,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,
具体的实现过程与在J2SE环境中保存数据到文件中是一样的。

  下面例子演示 如何保存文件、读取文件和把文件保存在SD卡上。

   

(1) 保存文件

 1 public void save(String str) {
 2         
 3         try {
 4             FileOutputStream output = this.openFileOutput("test.txt", Context.MODE_WORLD_READABLE);
 5             output.write(str.getBytes());
 6             output.close();
 7             Toast.makeText(MainActivity.this,"Saved",Toast.LENGTH_LONG).show();
 8         } catch (IOException e) {
 9             // TODO: handle exception
10         }
11         
12     }

  openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。
创建的文件保存在/data/data/<package name>/files目录,如: /data/data/com.example.filesave/files/test.txt

 

openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:
Context.MODE_PRIVATE
Context.MODE_APPEND
Context.MODE_WORLD_READABLE
Context.MODE_WORLD_WRITEABLE
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,
如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入:
openFileOutput("test.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);  android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,

任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。
除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。

 

(2) 读取文件

 1     public String load() {
 2         String str = "";
 3         try {
 4             FileInputStream input = this.openFileInput("test.txt");
 5             ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
 6             byte[] buffer = new byte[1024]; 
 7             
 8             int length = -1;
 9             
10             while ((length=input.read(buffer))!=-1) {
11                 byteOutput.write(buffer,0,length);
12                 
13             }
14             
15             input.close();
16             byteOutput.close();
17 
18             str = byteOutput.toString();
19             Toast.makeText(MainActivity.this,"Load",Toast.LENGTH_LONG).show();
20         } catch (IOException e) {
21             // TODO Auto-generated catch block
22             e.printStackTrace();
23         }
24         
25         return str;
26         
27     }

对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
Activity还提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用于获取/data/data/<package name>/cache目录
getFilesDir()方法用于获取/data/data/<package name>/files目录。

打印文件读取的内容:

 

(3) 创建SD卡  

  使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在SDCard。 SDCard是干什么的?你可以把它看作是插在手机上的移动硬盘或U盘。

创建模拟器SD卡有两种方法

第一种:用命令行创建
1.打开你安装Android的文件夹找到tools这个文件夹,复制路径
2.设置命令提示符的默认路径为你复制的路径
3.在后面输入如下命令(注意空格):

  mksdcard 256M C:\Users\chendd\Desktop\sdcard.img
  256M是你要设置SD卡的大小,后面是你创建虚拟SD卡的路径。
  回车,这样就创建好了SD卡的镜像文件,还要让Android模拟器知道这个SD卡在什么地方,命令如下:
  dir C:\Users\chendd\Desktop\sdcard.img
  再次回车

4、设置模拟器,edit里SD Card 选择File,然后browse你的sdcard.img,再edit AVD结束。

但是我这样创建这个时候File Exprorer下的sdcard的permissions变成了d--------,没有读写权限,囧!

第二种:直接在AVD manager创建

创建60M的内存卡sdcard的permissions变成了d---rwxr-x,可以读写,这样创建简单霸气!

在程序中访问SDCard,你需要申请访问SDCard的权限。
在AndroidManifest.xml中加入访问SDCard的权限如下:

1     <!-- 在SDCard中创建与删除文件权限 -->
2     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
3 
4     <!-- 往SDCard写入数据权限 -->
5     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

(4) 保存文件在SD卡上
  要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写

 1     public void save_sd(String str) {
 2         
 3         File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录
 4 
 5         File saveFile = new File(sdCardDir, "testsd.txt");
 6         
 7         FileOutputStream outStream;
 8         try {
 9             if(!saveFile.exists())
10             {
11                 saveFile.createNewFile();
12             }
13             outStream = new FileOutputStream(saveFile);
14             outStream.write(str.getBytes());
15             outStream.close();
16             Toast.makeText(MainActivity.this,"Save_sd",Toast.LENGTH_LONG).show();
17         } catch (IOException e) {
18             // TODO Auto-generated catch block
19             e.printStackTrace();
20         }
21         
22     }

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

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

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

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

// 第一种写法更灵活

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

FileOutputStream outStream = new FileOutputStream(saveFile);

outStream.write("test".getBytes());

outStream.close();

 

文件对SD卡的读写一路报太多错误,在下一篇整理出来。

posted @ 2014-03-13 20:37  aiguozhe1991  阅读(1096)  评论(0编辑  收藏  举报