Android Internal and External storage 讀寫檔案(转)

By | 01月08日
Advertisement

http://blog.tonycube.com/2012/03/android-internal-and-external-storage.html

1. 存在手機還是SDcard

Android可以將檔案儲存在手機上的記憶體(Internal Storage),或是外部儲存媒體 SDcard(External Storage)。
Internal storage是儲存在 /data/data/package_name/files 目錄中,每個App會有一個獨立的目錄來儲存檔案,其他App無法存取。由於是儲存在手機的記憶體中,所有會有空間的限制,不建議在這裡儲存容量太大的檔案。使用Internal storage不需要額外設定權限。

使用External Storage則必須設定讀取SDcard的權限:

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

儲存目錄為 /sdcard ,容量則取決於SDcard本身的容量。儲存在Internal storage時,當App被移除,所有的資料也會被移除,而External storage因為是儲存在SDcard,所以不會因為App被移除而消失。

2. 使用方法

兩者使用方式基本上都相同,只是在讀寫時會使用不同的類別。

Internal storage:

//讀檔
FileInputStream fin = this.openFileInput(filename);
//寫檔
FileOutputStream fout = this.openFileOutput(filename, Context.MODE_PRIVATE);

對Internal storage做讀寫時是使用 android.content.ContextWrapper 類別中的方法,this是指該Activity。Context.MODE_PRIVATE是指該檔案為私有的,只能由該App讀寫。另外還有其他指示性的常數,在 Context 抽象類別可以找到以 MODE_ 開頭的常數。

External storage:

//取得外部儲存媒體的目錄(這裡會是/sdcard)
String path = Environment.getExternalStorageDirectory().getPath();
//檔案路徑,記得要加斜線(這樣/sdcard/filename)
File file = new File(path + "/" + filename);
//讀檔
FileInputStream fin = new FileInputStream(file);
//寫檔
FileOutputStream fout = new FileOutputStream(file);

基本上就是使用原本的Java.io裡的類別。這樣檔案會直接儲存在SDcard下,或許你會想要建立一個自己App使用的目錄,使用的方式如下:

//先取得sdcard目錄
String path = Environment.getExternalStorageDirectory().getPath();
//利用File來設定目錄的名稱(myappdir)
File dir = new File(path + "/myappdir");
//先檢查該目錄是否存在
if (!dir.exists()){
    //若不存在則建立它
    dir.mkdir();
}

如此就會有一個 /sdcard/myappdir 的目錄產生。之後你的檔案就可以放在

File file = new File(path + "/myappdir/" + filename);

此外,在使用External storage之前,最好先檢查一下外部媒是否存在及能否讀寫。

//取得外部儲存媒體的狀態
String state = Environment.getExternalStorageState();
//判斷狀態
if (Environment.MEDIA_MOUNTED.equals(state)) {
   Log.d(TAG, "可以讀寫");
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
   Log.d(TAG, "只可以讀取,無法寫入");
} else {
   Log.d(TAG, "無法讀寫");
}

3. 程式碼

我把實際使用的程式碼寫成方法,方便使用,請依自己的需求修改,如下:

Internal storage:

//寫檔
private void writeDataToFile(String filename, String data){
  try {
    FileOutputStream fout = this.openFileOutput(filename, Context.MODE_PRIVATE);
    fout.write(data.getBytes());
    fout.close();
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

//讀檔
private String readDataFromFile(String filename){
  String result = null;
  try {
    StringBuilder sb = new StringBuilder();
    FileInputStream fin = this.openFileInput(filename);
    byte[] data = new byte[fin.available()];
    while (fin.read(data) != -1) {
      sb.append(new String(data));
    }
    fin.close();
    result = sb.toString();
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }
return result;
}

External storage:

//寫檔到sdcard
private void writeToSDcard(String filename, String data){
   //建立自己的目錄
   String path = Environment.getExternalStorageDirectory().getPath();
   File dir = new File(path + "/movietime");
   if (!dir.exists()){
     dir.mkdir();
   }

   try {
       File file = new File(path + "/movietime/" + filename);
       FileOutputStream fout = new FileOutputStream(file);
       fout.write(data.getBytes());
       fout.close();
   } catch (FileNotFoundException e) {
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   }
   Log.d(TAG, "Write to SDCARD!");
}

//從sdcard讀檔
private String readFromSDcard(String filename){
    String path = Environment.getExternalStorageDirectory().getPath();
    File file = new File(path + "/movietime/" + filename);
    StringBuilder sb = new StringBuilder();
    try {
        FileInputStream fin = new FileInputStream(file);
        byte[] data = new byte[fin.available()];
        while (fin.read(data) != -1) {
            sb.append(new String(data));
        }
        fin.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Log.d("TAG", "Read from SDCARD: " + json.toString());
    return sb.toString();
}

Similar Posts:

  • Linux 的檔案屬性與目錄配置

    Linux 最優秀的地方之一,就在於他的多人多工的環境. 而為了讓各個使用者具有較安全的管理機制,因此檔案的權限管理就變的很重要了. Linux 一般將檔案可存取的方式分為三個類別,分別是 owner/group/other, 且各有 read/write/excute 等權限.若管理得當,將會讓您的 Linux 主機變的較為安全. 另外,您如果首次接觸 Linux 的話,那麼, 在 Linux 底下這麼多的目錄/檔案,到底代表什麼意義呢? 底下我們就來一一介紹呢! 1. 使用者與群組 2. L

  • 【Android基础笔记14】Android数据存储——External和Internal Storage

    一.Internal Storage存储操作: (一).Internal Storage存储特点: 1.内部存储的路径   data/data/应用程序包名/files/文件名 2.内部存储的特点: 2.1  内部存储总是有效的 2.2  默认情况内部存储只能当前应用访问 2.3  当应用程序卸载时 内部存储的文件也会随着删除   内部存储在应用程序的内部目录中 (二).Internal Storage存储案例 向内部存储中写入数据: 或者采用如下案例: 从内存存储中读取内容: 或者采取如下代码

  • 使用Device IO Control 讀寫 USB Mass Storage

    http://www.ezblog.idv.tw/Download/USBStorage.rar 這是一個不透過檔案系統,去讀寫USB Mass Storage 任何位置(包含FAT)的方式 首先需安裝微軟的DDK並include "usbioctl.h" , "usbdi.h" , "ntddscsi.h" 有幾個資料結構要定義 typedef struct _SCSI_Device_Info_ { SCSI_PASS_THROUGH Spt;

  • 从零开始学android&amp;lt;数据存储(3)External Storage外部存储.三十七.&amp;gt;

    所谓的外部存储External Storage就是将数据文件保存在SD卡上. 1.但是在保存数据时需要先对SD卡的状态进行判断. 使用Environment.getExternalStorageState()可以SD卡的运行状态 分别有一下的状态 MEDIA_UNKNOWN, MEDIA_REMOVED, MEDIA_UNMOUNTED, MEDIA_CHECKING, MEDIA_NOFS, MEDIA_MOUNTED, MEDIA_MOUNTED_READ_ONLY, MEDIA_SHARE

  • Saving Files on External Storage 在外部存储保存文件

    Save a File on External Storage Because the external storage may be unavailable-such as when the user has mounted thestorage to a PC or has removed the SD card that provides the external storage-youshould always verify that the volume is available be

  • BugFix 4: External Storage can&#39;t write

    问题描述:Android上做录音,将录音文件保存在sdcard.需要对external storage可写.但是程序却报错,因为external storage不可写. 原因:已在AndroidManifest.xml中添加 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 但是仍然未获得external storage的写权限

  • Smartcard 讀寫器函數庫的使用說明

    Smartcard 讀寫器函數庫的使用說明 一.IC卡與作業系統的整合 前面所談的標準及各種IC卡的規格,多半只論及IC卡或讀卡機.使用者要使用讀卡機時,必須安裝廠商提供之驅動程式(drivers),開發應用程式. PC/SC(Personal Computer/Smart Card)支援ISO7816-4的基本指令集,界定了IC卡.讀卡機及作業系統的責任與分工,各家讀卡機廠商只要遵循PC/SC所定義之介面與方法開發 驅動程式,即可結合到Windows或其他作業系統,應用程式只要透過單一標準介面

  • 把整個作業系統放進記憶體裡,RAM OS 讓讀寫效能快10倍

    翻開多數的RAM Disk教學,大部分都會告訴你:把暫存檔放到記憶體.把置換檔放到記憶體.把龐大的遊戲資料檔放到記憶體.只是RAM Disk的應用也不是一日兩日了,還在搞這些玩法難免顯得八股. 快速瀏覽: 淺談Windows記憶體管理機制 虛擬機器:最簡單的RAM OS玩法 Boot in RAM:直接從記憶體開機 RAM OS效能實測 把系統碟放進RAM Disk 「把整個作業系統都搬到記憶體」這種形容有點模糊,更精準的說法是「把系統碟放進記憶體」,讓作業系統一開機就是從記憶體載入,甚至還能達

  • Inside SharePoint Creating an External Storage Solution for SharePoint

    Inside SharePoint Creating an External Storage Solution for SharePoint Pav Cherny Code download available at: ChernySharePoint2009_06.exe (2,006 KB) Contents Internal Binary Storage External Binary Storage Building an Unmanaged EBS Provider Building

  • External Storage外部存储——SD卡

    External Storage外部存储--SD卡 JavaIO操作 文件操作 FileInputStream,FileOutputStream,FileReader, FileWriter File :操纵文件或者目录 BufferedReader readLine() 使用文件的路径: Java开发:相对路径 Android卡发:绝对路径,sd卡根路径+项目文件夹+文件    注意事项: 1)权限 (只要程序中使用SD卡,添加写入权)  READ_EXTERNAL_STORAGE(新增) W

Tags: