«

Android数据访问存储之内存读写

时间:2024-3-2 18:52     作者:韩俊     分类: Android


Android数据存储之内存读写的两大内存

1、手机内存数据读写

getFileDir( ) : 得到当前app在手机内存存储数据的位置 /data/data/当前app包名/files

getCacheDir( ) : 得到当前app在手机内存存储数据的位置/data/data/当前app包名/cache

openFileInput(String name) : 直接得到/data/data/当前app包名/files/name文件的输入流

openFileOutput(String name,int mode) : 直接得到/data/data/当前app包名/files/name文件的输出流,mode为写入文件时的权限

2、sdcard数据读写

Environment.getExternalStorageDirectory( ) : 得到当前app所在手机的sdcard位置/storage/sdcard

Environment.getExternalStoragePublicDirectory(String type) : 得到当前app所在手机的sdcard位置下的公共子文件夹/storage/sdcard/....

Android数据存储之内存读写应用实例

布局文件 activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/tv_main_memerysize"
        android:layout_width="match_parent"
        android:layout_height="80dip"
        android:textSize="20sp"
        android:textColor="#6666ff"
        android:text="内存大小"/>

    <TextView
        android:id="@+id/tv_main_sdcard"
        android:layout_width="match_parent"
        android:layout_height="40dip"
        android:textSize="20sp"
        android:textColor="#ff6666"
        android:text="SDCard存在否"/>
    <TextView
        android:id="@+id/tv_main_sdcardsize"
        android:layout_width="match_parent"
        android:layout_height="80dip"
        android:textSize="20sp"
        android:textColor="#ff6666"
        android:text="SDCard内存大小"/>

    <EditText 
        android:id="@+id/et_main_content"
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:textSize="20sp"
        android:text="测试写入内存:n将这里的文本信息保存到内存文件 testmemeryio.txt"/>

    <Button 
        android:id="@+id/btn_main_writememery"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="写入内存"/>
    <Button 
        android:id="@+id/btn_main_writesdcard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="写入sdcard"/>

</LinearLayout>

示例代码 MainActivity.java

package com.yihui.iomemery;

import java.io.FileOutputStream;
import java.io.IOException;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Environment;
import android.os.StatFs;
import android.text.format.Formatter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

    private TextView tv_main_memerysize;
    private TextView tv_main_sdcard;
    private TextView tv_main_sdcardsize;

    private EditText et_main_content;

    private Button btn_main_writememery;
    private Button btn_main_writesdcard;

    private boolean sdcardMount = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_main_memerysize = (TextView) findViewById(R.id.tv_main_memerysize);
        tv_main_sdcard = (TextView) findViewById(R.id.tv_main_sdcard);
        tv_main_sdcardsize = (TextView) findViewById(R.id.tv_main_sdcardsize);
        et_main_content = (EditText) findViewById(R.id.et_main_content);
        btn_main_writememery = (Button) findViewById(R.id.btn_main_writememery);
        btn_main_writesdcard = (Button) findViewById(R.id.btn_main_writesdcard);

        btn_main_writememery.setOnClickListener(this);
        btn_main_writesdcard.setOnClickListener(this);

        //判断sdcard是否已安装
        tv_main_sdcard.setText("sdcard未安装");
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            sdcardMount = true;
            tv_main_sdcard.setText("sdcard已安装");
        }

        //得到sdcard和内存的大小及可用容量
        if(sdcardMount){
            tv_main_sdcardsize.setText("sdcard" + getStorgeFileSize(Environment.getExternalStorageDirectory().getPath()));
        }else {
            tv_main_sdcardsize.setText("sdcard总内存:0MB; 可用内存:0MB");
        }
        tv_main_memerysize.setText("手机" + getStorgeFileSize(Environment.getDataDirectory().getPath()));

    }

    /* 两个按钮的监听事件,将内容写入内存文件testmemeryio.txt  */
    @Override
    public void onClick(View v) {
        String text = et_main_content.getText().toString();
        boolean success = true;

        switch (v.getId()) {
            case R.id.btn_main_writesdcard: //写入sdcard
                FileOutputStream fos = null;
                try {
                    fos = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + "/m.txt");
                    fos.write(text.getBytes("utf-8"));
                    fos.flush();
                } catch (IOException e) {
                    success = false;
                    e.printStackTrace();
                } finally {
                    if(fos != null){
                        try {
                            fos.close();
                            fos = null;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                Toast.makeText(MainActivity.this, success == true ? "写入sdcard文件成功" : "写入sdcard文件失败", 0).show();
                break;

            case R.id.btn_main_writememery: //写入内存
                FileOutputStream openFileOutput = null;

                try {
                    //使用openFileOutput()函数,直接在/data/data/包名/files/目录下创建文件
                    openFileOutput = openFileOutput("testmemeryio.txt", Context.MODE_PRIVATE);    //私有模式写文件
                    openFileOutput.write(text.getBytes("utf-8"));
                    openFileOutput.flush();
                } catch (IOException e) {
                    success = false;
                    e.printStackTrace();
                } finally {
                    if(openFileOutput != null){
                        try {
                            openFileOutput.close();
                            openFileOutput = null;
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                Toast.makeText(MainActivity.this, success == true ? "写入内存文件成功" : "写入内存文件失败", 0).show();
                break;

            default:
                break;
        }
    }

    /* 取得内存文件空间大小及可用大小 */
    @SuppressLint("NewApi") private String getStorgeFileSize(String path){
        String fileSizeDesc = null;

        StatFs statFs = new StatFs(path);                           //获得磁盘状态的对象
        long blockSizeLong = statFs.getBlockSizeLong();             //获得磁盘一个扇区的大小
        long blockCountLong = statFs.getBlockCountLong();           //获得磁盘空间总的扇区数
        long availableBlocksLong = statFs.getAvailableBlocksLong(); //获得磁盘空间总的可用扇区数
        fileSizeDesc = "总内存:" + Formatter.formatFileSize(MainActivity.this, blockSizeLong*blockCountLong)
                     + "; 可用内存:" + Formatter.formatFileSize(MainActivity.this, blockSizeLong*availableBlocksLong);

        return fileSizeDesc;
    }
}

注意:因为要读写SDCard,所以在项目里面的AndroidManifest.xml功能清单文件里面添加读写SDCard的权限

    ......
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>  <!-- sdcard读权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- sdcard写权限 -->
    ......
运行效果:

在File Explorer下可以看到 /data/data/com.yihui.iomemery/files/testmemeryio.txt文件,且写入的内容就是UI上面文本框里面的内容

/storage/sdcard/m.txt文件,且写入的内容也是UI上面文本框里面的内容

Android数据存储之读写模式(读写权限)

Android是基于Linux操作系统的,所以Android的文件访问权限与Linux系统的文件访问权限是一致的,具体参考下图说明

1、Android数据访问权限实现方式

Context类的public abstract FileOutputStream openFileOutput(String name, int mode)

2、其中mode就是文件访问权限模式,主要4种模式

Context.MODE_PRIVATE:私有模式(默认模式),只能被应用本身和同一群组的人访问;写入的内容覆盖原文件内容

Context.MODE_APPEND: 追加模式也是私有模式,只能被应用本身和同一群组的人访问;如果文件存在就追加内容,如果文件不存在就新建文件并写入内容

Context.MODE_WORLD_READABLE: 所有人可读权限

Context.MODE_WORLD_WRITEABLE:所有人可写权限

也可通过多个组合同时拥有多个读写权限,Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE表示所有人可读+可写



http://blog.csdn.net/yihuiworld


标签: android

热门推荐