android开发框架(二)数据持久化(1)-文件存储

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而言,需要修改路径。

你可能感兴趣的:(Android开发,数据存储)