android數據存儲主要有文件存儲(如內部存儲和外部存儲:SDCard),SQLite,sharedpreference,contentprovider幾種方式。
一丶文件存儲
文件存儲方式因Android設備的自帶內存和外置SDCard而分爲Internal Storage和External Storage。
Internal Storage
內部存儲,在Android開發中可以直接使用設備的內部存儲器中保存文件,默認情況下,以這種方式保存的和數據是隻能被當前程序訪問,文件保存在本程序對應的路徑下,在其他程序中是無法訪問到的,而當用戶卸載該程序的時候,這些文件也會隨之被刪除。
使用內部存儲保存數據的方式,基本上也是先獲得一個文件的輸出流,然後以write()的方式把待寫入的信息寫入到這個輸出流中,最後關閉流即可,這些都是Java中IO流的操作。具體步驟如下:
使用Context.openFileOutput()方法獲取到一個FileOutputStream對象。
把待寫入的內容通過write()方法寫入到FileOutputStream對象中。
- 最後close()關閉流。
/**
* 保存內容到內部存儲器中
* @param filename 文件名
* @param content 內容
*/
public void save(String filename, String content) throws IOException {
// FileOutputStream fos=context.openFileOutput(filename,
// Context.MODE_PRIVATE);
File file = new File(context.getFilesDir(), filename);
FileOutputStream fos = new FileOutputStream(file);
fos.write(content.getBytes());
fos.close();
}
/**
* 通過文件名獲取內容
* @param filename 文件名
* @return 文件內容
*/
public String get(String filename) throws IOException {
FileInputStream fis = context.openFileInput(filename);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = -1;
while ((len = fis.read(data)) != -1) {
baos.write(data, 0, len);
}
return new String(baos.toByteArray());
}
/**
* 以追加的方式在文件的末尾添加內容
* @param filename 文件名
* @param content 追加的內容
*/
public void append(String filename, String content) throws IOException {
FileOutputStream fos = context.openFileOutput(filename,
Context.MODE_APPEND);
fos.write(content.getBytes());
fos.close();
}
External Storage
使用外部存儲實現數據持久化,這裏的外部存儲一般就是指的是sdcard。使用sdcard存儲的數據,不限制只有本應用訪問,任何可以有訪問Sdcard權限的應用均可以訪問,而Sdcard相對於設備的內部存儲空間而言,會大很多,所以一般比較大的數據,均會存放在外部存儲中。
相比較於內部存儲方式,外部存儲有幾個方面需要注意:
判斷SDCard是否存在且可用,
獲取是否存在有效的Sdcard,使用的是Environment.getExternalStorageState()方法獲取存儲文件的路徑,可以先獲取文件的根路徑
使用Envir.getExternalStorageDirectory()方法獲取當Sdcard的根目錄,可以通過它訪問到相應的文件- 在AndroidManifest文件中添加讀寫外部文件權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
/**
* 寫入文件方法
*
* @param content
*/
public static void write(String content) {
try {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File sdCardDir = Environment.getExternalStorageDirectory();
String dirPath = sdCardDir.getCanonicalPath() + File.separator
+ path;
File dir = new File(dirPath);
if (!dir.exists()) {
dir.mkdirs();
}
File targetFile = new File(dirPath + File.separator
+ CrashInfoFile);
RandomAccessFile raf = new RandomAccessFile(targetFile, "rw");
raf.seek(targetFile.length());
raf.write(content.getBytes());
raf.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 讀取SDcard文件
*/
public static String readSDcard() {
StringBuffer str = new StringBuffer();
try {
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
File file = new File(Environment.getExternalStorageDirectory()
.getCanonicalPath()
+ File.separator
+ path
+ File.separator + CrashInfoFile);
if (file.exists()) {
// 打開文件輸入流
FileInputStream fileR = new FileInputStream(file);
BufferedReader reads = new BufferedReader(
new InputStreamReader(fileR));
String st = null;
while ((st = reads.readLine()) != null) {
str.append(st + "\n");
}
fileR.close();
} else {
}
} else {
System.out.println("SD卡不存在!!");
}
} catch (Exception e) {
e.printStackTrace();
}
return str.toString();
}
/**
* 刪除文件
*/
public static void deleteSDcard() {
try {
File f = new File(Environment.getExternalStorageDirectory()
.getCanonicalPath() + File.separator + path);
File f2 = new File(Environment.getExternalStorageDirectory()
.getCanonicalPath()
+ File.separator
+ path
+ File.separator + ScreenShotFile);
if (f.exists()) {
File[] fl = f.listFiles();
for (int i = 0; i < fl.length; i++) {
if (fl[i].toString().endsWith(".txt")
|| fl[i].toString().endsWith(".TXT")) {
if (fl[i].delete()) {
Log.e("DeleteSDcard-CrashInfo.txt", "Success。。。");
} else {
Log.e("DeleteSDcard-CrashInfo.txt", "Faild。。。");
}
}
}
}
if (f2.exists()) {
File[] fp = f2.listFiles();
for (int i = 0; i < fp.length; i++) {
if (fp[i].toString().endsWith(".png")
|| fp[i].toString().endsWith(".PNG")) {
if (fp[i].delete()) {
Log.e("DeleteSDcard-ScreenShot.png", "Success。。。");
} else {
Log.e("DeleteSDcard-ScreenShot.png", "Faild。。。");
}
}
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
PS:對於現在市面上很多Android設備,自帶了一個大的存儲空間,一般是8GB或16GB,並且又支持了Sdcard擴展,對於這樣的設備,使用Enviroment.getExternalStorageDirectory()方法只能獲取到設備自帶的存儲空間,對於另外擴展的Sdcard而言,需要修改路徑。