前言:
所有 Android 裝置都有兩個檔案存儲區域:“内部”和“外部”存儲。這些名稱在 Android 早期産生,當時大多數裝置都提供内置的非易失性記憶體(内部存儲),以及移動存儲媒體,比如micro SD 卡(外部存儲)。一些裝置将永久性存儲空間劃分為“内部”和“外部”分區,即便沒有移動存儲媒體,也始終有兩個存儲空間,并且無論外部儲存設備是否可移動,API 的行為均一緻。
内部存儲的特點:
- 不必申請權限,始終可用
- 使用者不能通路
- 一般情況下,别的應用不能通路。隻有明确将檔案設定為可讀或可寫,并且别的應用知道您的應用的軟體包名稱和檔案名,才能通過程式設計通路。
- 當應用被解除安裝時,系統會從内部存儲中移除您的應用的所有檔案。
- 當您希望使用者或其他應用均無法通路您的檔案時,内部存儲是最佳選擇。
使用說明:
import android.content.Context;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class InternalStorage {
/**
* 得到内部存儲的根目錄:/data/data/包名/files
*/
public static File getRootDir(Context context) {
return context.getFilesDir().getAbsoluteFile();
}
/**
* 向内部存儲根目錄下某個檔案寫入一個字元串
*/
public static void writeString2File(Context context, String fileName, String content) {
FileOutputStream outputStream = null;
try {
// fileName隻能是檔案名,不能包含目錄分隔符,該檔案若不存在會自動建立
outputStream = context.openFileOutput(fileName, Context.MODE_PRIVATE);
outputStream.write(content.getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 讀取内部存儲根目錄下某個檔案的内容
*/
public static String readStringFromFile(Context context, String fileName) {
BufferedReader reader = null;
StringBuffer buffer = new StringBuffer();
String line = null;
try {
// fileName隻能是檔案名,不能包含目錄分隔符,該檔案若不存在FileNotFoundException
reader = new BufferedReader(new InputStreamReader(context.openFileInput(fileName)));
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return buffer.toString();
}
/**
* 得到内部緩存的根目錄:/data/data/包名/cache
*/
public static File getCacheRootDir(Context context) {
return context.getCacheDir().getAbsoluteFile();
}
/**
* 向内部緩存根目錄下某個臨時檔案裡寫入一個字元串
*/
public static void writeString2CacheFile(Context context, String fileName, String content) {
FileOutputStream outputStream = null;
File file = null;
try {
file = File.createTempFile(fileName, null, context.getCacheDir());
outputStream = new FileOutputStream(file);
outputStream.write(content.getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 得到"/data/data/包名/"下名為app_dir的目錄(app_字首為系統自動添加),若不存在會自動建立
*/
public static File getDir(Context context, String dir) {
return context.getDir(dir, Context.MODE_PRIVATE);
}
/**
* 删除"/data/data/包名/files/"下名為fileName的檔案,删除成功傳回true,否則傳回false
* fileName隻能是檔案名,不能包含目錄分隔符
*/
public static boolean deleteFile(Context context, String fileName) {
return context.deleteFile(fileName);
}
}