android数据存储主要有文件存储(如内部存储和外部存储:SDCard),SQLite,sharedpreference,contentprovider几种方式。
一丶文件存储
文件存储方式因Android设备的自带内存和外置SDCard而分为Internal Storage和External Storage。
Internal Storage
内部存储,在Android开发中可以直接使用设备的内部存储器中保存文件,默认情况下,以这种方式保存的和数据是只能被当前程序访问,文件保存在本程序对应的路径下,在其他程序中是无法访问到的,而当用户卸载该程序的时候,这些文件也会随之被删除。
使用内部存储保存数据的方式,基本上也是先获得一个文件的输出流,然后以write()的方式把待写入的信息写入到这个输出流中,最后关闭流即可,这些都是Java中IO流的操作。具体步骤如下:
使用Context.openFileOutput()方法获取到一个FileOutputStream对象。
把待写入的内容通过write()方法写入到FileOutputStream对象中。
/** * 保存内容到内部存储器中 * @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的根目录,可以通过它访问到相应的文件
<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而言,需要修改路径。