android SD卡文件的讀寫


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文件

View Code
 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>

第二步:寫入核心代碼:

View Code
  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文件,主要是加入權限

View Code
 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>

效果圖:





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM