Android在代碼中如何使用SD卡
1 SD 是否可用檢查
有兩種方式,一種是寫一個監(jiān)聽函數(shù),用來監(jiān)聽
- private final BroadcastReceiver broadcastRec = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (intent.getAction().equals("android.intent.action.MEDIA_MOUNTED")) { //SD 卡已經(jīng)成功掛載
- //有SD 卡
- } else if (intent.getAction().equals("android.intent.action.MEDIA_REMOVED")
- ||
- intent.getAction().equals("android.intent.action.ACTION_MEDIA_UNMOUNTED")
- ||
- intent.getAction().equals("android.intent.action.ACTION_MEDIA_BAD_REMOVAL")) {//各種未掛載狀態(tài)
- //無SD 卡
- }
- }
- };
另一種在我看來,更簡單一些:
- File f = new File("/sdcard/");
- f.exists();
2 卡上數(shù)據(jù)的讀寫
在動手之前,我們先來看看,要對SD 卡進行讀寫操作,Android 為我們準備了哪些類/接口。
接口:FileFilter
類:File、FileInputStream、FileOutputStream
下面我們依次對上面出場的做個簡單的介紹吧,同時,也會給出若干代碼來說明各個類如何使用
3 File
文件系統(tǒng)的一個抽象描述類,可以使用相對路徑和絕對路徑,該類提供了若干方法查詢/修改文件信息
- File file = new File("/sdcard/a.txt");
判斷文件是否存在:
- file.exists()
“文件”是目錄還是文件
- file.isDirectory()
如果文件為目錄,如何列出子目錄呢?
- File[ ] filefiles = file.listFiles();
對于文件,如果獲得文件的一些信息
- file.length(); //文件的長度
- file.canRead(); //文件可以讀嗎
- file.canWrite(); //文件可以寫嗎
- file.delete(); //刪除該文件
下面,給出一些片斷代碼來展示如何使用File 類
- //創(chuàng)建一個新文件
- File file = new File("/sdcard/a.txt");
- if (!file.exists()) {
- try {
- file.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- } }
- //創(chuàng)建一個新文件夾
- File file = new File("/sdcard/a/b/c");
- if (!file.exists()) {
- try {
- file.mkdirs();
- }
請注意,mkdirs()和mkdir()的用法,mkdirs()表示,如果需要,會先創(chuàng)建上層目錄,如上述代碼中,如果SD 卡根目錄不存在目錄a,那么,使用mkdir()會拋出異常。
#p#
4 FileFilter
我們知道,listFiles()會列出當前目錄下的文件,但是,另一個問題出來了,如果當前目錄下文件雜亂無部分,而我們又不想列出所有文件,怎么辦?FileFilter 提供了一個解決方法。我們只需要實現(xiàn)public abstract boolean accept(File pathname)接口就可以了。
- FileFilter filter = new FileFilter() {
- public boolean accept (File file) {
- if (file.isFile() && file.getAbsolutePath().toLowerCase().endsWith(".txt")) {
- return true;
- }
- return false;
- }
- };
- File[] filefiles = file.listFiles(filter);
以上代碼展示了如何只列出當前目錄下的TXT 文件。
5 FileInputStream
我們不僅需要對文件進行操作,還需要對文件的內(nèi)容進行操作,這時候,F(xiàn)ileInputStream 就登場了
FileInputStream 繼承自InputStream,但是FileInputStream 使用了緩沖,以提高頻繁讀入數(shù)據(jù)時的性能。
使用FileInputStream 也很簡單
- FileInputStream fis = new FileInputStream("/sdcard/a.txt");
- byte[ ] abytes = new byte[1024]
- int len = fis.read(abytes);
在上述代碼中,我們打開了SD 卡根目錄下的a.txt 文件,同時,讀入1K 的數(shù)據(jù),需要注意的是,read 并不能保
證一定讀入期望長度的數(shù)據(jù),我們需要對讀入數(shù)據(jù)的長度進行檢查。
6 FileOutputStream
- FileOutputStream 與OutputStream 的用法差不多,在些也不多說,給出一個代碼吧:
- FileOutputStream fos = new FileOutputStream("/sdcard/a.txt");
- fos.write("Hello World!".getBytes());
- fos.flush();
上述代碼會向a.txt 中寫入Hello World 字符,請注意,F(xiàn)ileOutputStream 也使用了緩沖,因此,數(shù)據(jù)不會立即寫入文件中,當系統(tǒng)認為需要寫回數(shù)據(jù)的時候,真正的寫回才發(fā)生,因此,如果為了讓數(shù)據(jù)立即寫回,需要使用flush()方法。
也許你會問到,我不想把文件原有的內(nèi)容抹到,怎么?這個也簡單,
- FileOutputStream fos = new FileOutputStream("/sdcard/a.txt", true);
true 表示向文件后面追加數(shù)據(jù)
【編輯推薦】