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

来源:互联网 发布:黑米软件作者 判刑 编辑:程序博客网 时间:2024/05/18 01:43


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为写入文件时的权限

2sdcard数据读写

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

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

 

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

布局文件 activity_main.xml

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"  
  6.     android:paddingBottom="@dimen/activity_vertical_margin"  
  7.     android:paddingLeft="@dimen/activity_horizontal_margin"  
  8.     android:paddingRight="@dimen/activity_horizontal_margin"  
  9.     android:paddingTop="@dimen/activity_vertical_margin"  
  10.     tools:context=".MainActivity" >  
  11.   
  12.     <TextView  
  13.         android:id="@+id/tv_main_memerysize"  
  14.         android:layout_width="match_parent"  
  15.         android:layout_height="80dip"  
  16.         android:textSize="20sp"  
  17.         android:textColor="#6666ff"  
  18.         android:text="内存大小"/>  
  19.       
  20.     <TextView  
  21.         android:id="@+id/tv_main_sdcard"  
  22.         android:layout_width="match_parent"  
  23.         android:layout_height="40dip"  
  24.         android:textSize="20sp"  
  25.         android:textColor="#ff6666"  
  26.         android:text="SDCard存在否"/>  
  27.     <TextView  
  28.         android:id="@+id/tv_main_sdcardsize"  
  29.         android:layout_width="match_parent"  
  30.         android:layout_height="80dip"  
  31.         android:textSize="20sp"  
  32.         android:textColor="#ff6666"  
  33.         android:text="SDCard内存大小"/>  
  34.       
  35.     <EditText   
  36.         android:id="@+id/et_main_content"  
  37.         android:layout_width="match_parent"  
  38.         android:layout_height="0dip"  
  39.         android:layout_weight="1"  
  40.         android:textSize="20sp"  
  41.         android:text="测试写入内存:\n将这里的文本信息保存到内存文件 testmemeryio.txt"/>  
  42.       
  43.     <Button   
  44.         android:id="@+id/btn_main_writememery"  
  45.         android:layout_width="match_parent"  
  46.         android:layout_height="wrap_content"  
  47.         android:text="写入内存"/>  
  48.     <Button   
  49.         android:id="@+id/btn_main_writesdcard"  
  50.         android:layout_width="match_parent"  
  51.         android:layout_height="wrap_content"  
  52.         android:text="写入sdcard"/>  
  53.   
  54. </LinearLayout>  

示例代码 MainActivity.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.yihui.iomemery;  
  2.   
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5.   
  6. import android.annotation.SuppressLint;  
  7. import android.app.Activity;  
  8. import android.content.Context;  
  9. import android.os.Bundle;  
  10. import android.os.Environment;  
  11. import android.os.StatFs;  
  12. import android.text.format.Formatter;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.EditText;  
  17. import android.widget.TextView;  
  18. import android.widget.Toast;  
  19.   
  20. public class MainActivity extends Activity implements OnClickListener {  
  21.   
  22.     private TextView tv_main_memerysize;  
  23.     private TextView tv_main_sdcard;  
  24.     private TextView tv_main_sdcardsize;  
  25.       
  26.     private EditText et_main_content;  
  27.       
  28.     private Button btn_main_writememery;  
  29.     private Button btn_main_writesdcard;  
  30.       
  31.     private boolean sdcardMount = false;  
  32.       
  33.     @Override  
  34.     protected void onCreate(Bundle savedInstanceState) {  
  35.         super.onCreate(savedInstanceState);  
  36.         setContentView(R.layout.activity_main);  
  37.           
  38.         tv_main_memerysize = (TextView) findViewById(R.id.tv_main_memerysize);  
  39.         tv_main_sdcard = (TextView) findViewById(R.id.tv_main_sdcard);  
  40.         tv_main_sdcardsize = (TextView) findViewById(R.id.tv_main_sdcardsize);  
  41.         et_main_content = (EditText) findViewById(R.id.et_main_content);  
  42.         btn_main_writememery = (Button) findViewById(R.id.btn_main_writememery);  
  43.         btn_main_writesdcard = (Button) findViewById(R.id.btn_main_writesdcard);  
  44.           
  45.         btn_main_writememery.setOnClickListener(this);  
  46.         btn_main_writesdcard.setOnClickListener(this);  
  47.           
  48.         //判断sdcard是否已安装  
  49.         tv_main_sdcard.setText("sdcard未安装");  
  50.         if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){  
  51.             sdcardMount = true;  
  52.             tv_main_sdcard.setText("sdcard已安装");  
  53.         }  
  54.           
  55.         //得到sdcard和内存的大小及可用容量  
  56.         if(sdcardMount){  
  57.             tv_main_sdcardsize.setText("sdcard" + getStorgeFileSize(Environment.getExternalStorageDirectory().getPath()));  
  58.         }else {  
  59.             tv_main_sdcardsize.setText("sdcard总内存:0MB;  可用内存:0MB");  
  60.         }  
  61.         tv_main_memerysize.setText("手机" + getStorgeFileSize(Environment.getDataDirectory().getPath()));  
  62.           
  63.     }  
  64.   
  65.     /* 两个按钮的监听事件,将内容写入内存文件testmemeryio.txt  */  
  66.     @Override  
  67.     public void onClick(View v) {  
  68.         String text = et_main_content.getText().toString();  
  69.         boolean success = true;  
  70.           
  71.         switch (v.getId()) {  
  72.             case R.id.btn_main_writesdcard: //写入sdcard  
  73.                 FileOutputStream fos = null;  
  74.                 try {  
  75.                     fos = new FileOutputStream(Environment.getExternalStorageDirectory().getPath() + "/m.txt");  
  76.                     fos.write(text.getBytes("utf-8"));  
  77.                     fos.flush();  
  78.                 } catch (IOException e) {  
  79.                     success = false;  
  80.                     e.printStackTrace();  
  81.                 } finally {  
  82.                     if(fos != null){  
  83.                         try {  
  84.                             fos.close();  
  85.                             fos = null;  
  86.                         } catch (IOException e) {  
  87.                             e.printStackTrace();  
  88.                         }  
  89.                     }  
  90.                 }  
  91.                 Toast.makeText(MainActivity.this, success == true ? "写入sdcard文件成功" : "写入sdcard文件失败"0).show();  
  92.                 break;  
  93.               
  94.             case R.id.btn_main_writememery: //写入内存  
  95.                 FileOutputStream openFileOutput = null;  
  96.                   
  97.                 try {  
  98.                     //使用openFileOutput()函数,直接在/data/data/包名/files/目录下创建文件  
  99.                     openFileOutput = openFileOutput("testmemeryio.txt", Context.MODE_PRIVATE);  //私有模式写文件  
  100.                     openFileOutput.write(text.getBytes("utf-8"));  
  101.                     openFileOutput.flush();  
  102.                 } catch (IOException e) {  
  103.                     success = false;  
  104.                     e.printStackTrace();  
  105.                 } finally {  
  106.                     if(openFileOutput != null){  
  107.                         try {  
  108.                             openFileOutput.close();  
  109.                             openFileOutput = null;  
  110.                         } catch (IOException e) {  
  111.                             e.printStackTrace();  
  112.                         }  
  113.                     }  
  114.                 }  
  115.                 Toast.makeText(MainActivity.this, success == true ? "写入内存文件成功" : "写入内存文件失败"0).show();  
  116.                 break;  
  117.               
  118.             default:  
  119.                 break;  
  120.         }  
  121.     }  
  122.       
  123.     /* 取得内存文件空间大小及可用大小 */  
  124.     @SuppressLint("NewApi"private String getStorgeFileSize(String path){  
  125.         String fileSizeDesc = null;  
  126.           
  127.         StatFs statFs = new StatFs(path);                           //获得磁盘状态的对象  
  128.         long blockSizeLong = statFs.getBlockSizeLong();             //获得磁盘一个扇区的大小  
  129.         long blockCountLong = statFs.getBlockCountLong();           //获得磁盘空间总的扇区数  
  130.         long availableBlocksLong = statFs.getAvailableBlocksLong(); //获得磁盘空间总的可用扇区数  
  131.         fileSizeDesc = "总内存:" + Formatter.formatFileSize(MainActivity.this, blockSizeLong*blockCountLong)  
  132.                      + "; 可用内存:" + Formatter.formatFileSize(MainActivity.this, blockSizeLong*availableBlocksLong);  
  133.           
  134.         return fileSizeDesc;  
  135.     }  
  136. }  

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

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. ......  
  2. <uses-sdk  
  3.     android:minSdkVersion="8"  
  4.     android:targetSdkVersion="19" />  
  5. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>  <!-- sdcard读权限 -->  
  6. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- sdcard写权限 -->  
  7. ......  
运行效果:

 

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

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

 

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

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

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

   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
0 0
原创粉丝点击