您的位置:首页 > 移动开发 > Android开发

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

2015-06-09 17:38 357 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: