SD卡使用的是FAT(File Allocation Table)的文件系统,不支持访问模式和权限控制,SD卡适用于保存大尺寸的文件或者是一些无需设置访问权限的文件
Android模拟器支持SD卡,但模拟器中没有缺省的SD卡,开发人员须在模拟器中手工添加SD卡的映像文件
为了读\写SD卡上的文件,必须在AndroidManifest.xml中添加读\写SD卡的权限
在SD卡上创建与删除文件的权限
Android.permission.MOUNT_UNMOUNT_FIFESYSTEMS
向SD卡写入数据的权限
Android.permission.WRITE_EXTERNAL_STORAGE
编程访问SD卡方法一
首先需要检测系统的/mnt/sdcard目录是否可用
使用文件的输入输出流对SD卡里的文件进行读写
编程访问SD卡方法二
调用Environment的getExternalStorageState()方法判断手机上是否有SD卡,并且应用程序具有读写SD卡的权限
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
调用Environment的getExternalStorageDirectory()方法来获取外部存储器,也就是SD卡的根目录
使用文件的输入输出流对SD卡里的文件进行读写.
核心代码
写入文件到sd卡
//如果手机插入了SD卡,而且应用程序具有访问SD的权限
if (Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED))
{
//获取SD卡的目录
File sdCardDir = Environment.getExternalStorageDirectory();
File targetFile = new File(sdCardDir.getCanonicalPath()+ FILE_NAME);
//以指定文件创建
RandomAccessFile对象,第一个参数是文件名称,第二个参数是读写模式
RandomAccessFile raf = new RandomAccessFile(targetFile , "rw");
//将文件记录指针移动到最后
raf.seek(targetFile.length());
// 输出文件内容
raf.write(content.getBytes());
raf.close();
}
读取sd卡的文件
//如果手机插入了SD卡,而且应用程序具有访问SD的权限
if (Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED))
{
//获取SD卡对应的存储目录
File sdCardDir = Environment.getExternalStorageDirectory();
//获取指定文件对应的输入流
FileInputStream fis = new FileInputStream(sdCardDir.getCanonicalPath() + FILE_NAME);
//将指定输入流包装成BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
StringBuilder sb = new StringBuilder("");
String line = null;
//一直读,直到读到最后跳出
while((line = br.readLine()) != null)
{
//一直追加读出的内容
sb.append(line);
}
//返回读出的内容,并把它转化为字符串
return sb.toString();
}
注意,还要加权限
<!-- 在SD卡中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 向SD卡写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
下面列举一个实例,主要是按下写入按钮后把EditText的内容写入到sd卡里,然后按下读取按钮后就可以把sd卡里的文件读出来
第一步是编写main.xml文件
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent">
6 <EditText android:id="@+id/edit1"
7 android:layout_width="fill_parent"
8 android:layout_height="wrap_content"
9 android:lines="4"/>
10 <Button android:id="@+id/write"
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:text="@string/write"/>
14 <EditText android:id="@+id/edit2"
15 android:layout_width="fill_parent"
16 android:layout_height="wrap_content"
17 android:editable="false"
18 android:cursorVisible="false"
19 android:lines="4"/>
20 <Button android:id="@+id/read"
21 android:layout_width="wrap_content"
22 android:layout_height="wrap_content"
23 android:text="@string/read"/>
24 </LinearLayout>
第二步:写入核心代码:
1 package cn.edu.zwu.tel;
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileInputStream;
6 import java.io.InputStreamReader;
7 import java.io.RandomAccessFile;
8 import android.app.Activity;
9 import android.os.Bundle;
10 import android.os.Environment;
11 import android.view.View;
12 import android.view.View.OnClickListener;
13 import android.widget.Button;
14 import android.widget.EditText;
15 import android.os.Bundle;
16
17 public class FileSDsaveTest02Activity extends Activity
18 {
19 final String FILE_NAME = "/FileSDTest.ini";
20
21 @Override
22 public void onCreate(Bundle savedInstanceState)
23 {
24 super.onCreate(savedInstanceState);
25 setContentView(R.layout.main);
26 // 获取两个按钮
27 Button read = (Button) findViewById(R.id.read);
28 Button write = (Button) findViewById(R.id.write);
29 // 获取两个文本框
30 final EditText edit1 = (EditText) findViewById(R.id.edit1);
31 final EditText edit2 = (EditText) findViewById(R.id.edit2);
32 // 为write按钮绑定事件监听器
33 write.setOnClickListener(new OnClickListener()
34 {
35 @Override
36 public void onClick(View source)
37 {
38 // 将edit1中的内容写入文件中
39 write(edit1.getText().toString());
40 edit1.setText("");
41 }
42 });
43
44 read.setOnClickListener(new OnClickListener()
45 {
46 @Override
47 public void onClick(View v)
48 {
49 // 读取指定文件中的内容,并显示出来
50 edit2.setText(read());
51 }
52 });
53 }
54
55 private String read()
56 {
57 try
58 {
59 //如果手机插入了SD卡,而且应用程序具有访问SD的权限
60 if (Environment.getExternalStorageState()
61 .equals(Environment.MEDIA_MOUNTED))
62 {
63 //获取SD卡对应的存储目录
64 File sdCardDir = Environment.getExternalStorageDirectory();
65 //获取指定文件对应的输入流
66 FileInputStream fis = new FileInputStream(sdCardDir
67 .getCanonicalPath() + FILE_NAME);
68 //将指定输入流包装成BufferedReader
69 BufferedReader br = new BufferedReader(new
70 InputStreamReader(fis));
71 StringBuilder sb = new StringBuilder("");
72 String line = null;
73 while((line = br.readLine()) != null)
74 {
75 sb.append(line);
76 }
77 return sb.toString();
78 }
79 }
80 catch (Exception e)
81 {
82 e.printStackTrace();
83 }
84 return null;
85 }
86
87 private void write(String content)
88 {
89 try
90 {
91 //如果手机插入了SD卡,而且应用程序具有访问SD的权限
92 if (Environment.getExternalStorageState()
93 .equals(Environment.MEDIA_MOUNTED))
94 {
95 //获取SD卡的目录
96 File sdCardDir = Environment.getExternalStorageDirectory();
97 File targetFile = new File(sdCardDir.getCanonicalPath()
98 + FILE_NAME);
99 //以指定文件创建 RandomAccessFile对象,第一个参数是文件名称,第二个参数是读写模式
100 RandomAccessFile raf = new RandomAccessFile(
101 targetFile , "rw");
102 //将文件记录指针移动到最后
103 raf.seek(targetFile.length());
104 // 输出文件内容
105 raf.write(content.getBytes());
106 raf.close();
107 }
108 }
109 catch (Exception e)
110 {
111 e.printStackTrace();
112 }
113 }
114 }
第三步:修改AndroidMainFest文件,主要是加入权限
1 <?xml version="1.0" encoding="utf-8"?>
2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="cn.edu.zwu.tel"
4 android:versionCode="1"
5 android:versionName="1.0" >
6
7 <uses-sdk android:minSdkVersion="8" />
8
9 <application
10 android:icon="@drawable/ic_launcher"
11 android:label="@string/app_name" >
12 <activity
13 android:name=".FileSDsaveTest02Activity"
14 android:label="@string/app_name" >
15 <intent-filter>
16 <action android:name="android.intent.action.MAIN" />
17
18 <category android:name="android.intent.category.LAUNCHER" />
19 </intent-filter>
20 </activity>
21 </application>
22 <!-- 在SD卡中创建与删除文件权限 -->
23 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
24 <!-- 向SD卡写入数据权限 -->
25 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
26 </manifest>
效果图: