• Android攻城狮数据存储之文件存储


    数据篇——文件存储
    -- Activity的openFileOutput()方法可以用于把数据输出到文件中
    -- 创建的文件保存在 /data/data/<package name>/files 目录
    -- 实现过程与在 Java 中保存数据到文件中是一样的
    
    new File("/mnt/sdcard/test"); 路径指向安卓自带的目录,指向SD卡。
    new File("/mnt/extsdcard/test"); 指向外存储卡,但模拟器并没有这个。
    
    如果想要往文件中写入数据,需要相关的权限,不加权限是会报错的。
    在AndroidMainfest.xml 中加入权限
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

    File file = this.getFilesDir(); // 获取文件目录,这个目录是当前应用程序默认的数据存储目录
    Log.i("info",file.toString());
    ----------
    File file = this.getCacheDir(); //这个目录是当前应用程序默认的缓存文件的存放位置
    Log.i("info",file.toString());
    一些不是非常重要的文件可以通过这种方法创建、使用;
    如果手机的内存不足的时候,系统会自动去删除App的chche目录的数据。
    -------------------
    File file = this.getDir("imooc",MODE_PRIVATE);
    Log.i("info",file.toString());
    ------------------
    权限
    MODE_PRIVATE
    - 为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。
    MODE_APPEND
    - 模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
    MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE
    - 用来控制其他应用是否有权限读写该文件
    MODE_WORLD_READABLE
    - 表示当前文件可以被其他应用读取
    MODE_WORLD_WRITEABLE
    - 表示当前文件可以被其他应用写入
    -----------------
    外部文件
    this.getExternalFilesDir(type);
    -----------------
    可以得到外部的存储位置,该位置的数据跟内置是使用是一样的;
    优点:如果App卸载了,这里面的数据也会自动清除干净,没有残留
    File file = this.getExternalCacheDir();
    Log.i("info",file.toString());
    注意:如果开发者不遵守规则,没有把数据放入 data/data/<包名> 或者 /mnt/sdcard/Android/data/<包名>,那么,卸载之后数据将不会自动清除,将会造成很多垃圾数据。

    数据篇——File
    开启输入流:
    Android中文件存储的操作:
    Activity提供了 openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在Java中保存数据到文件中是一样的。
    创建的文件保存在/data/data/<package name>/files目录
    openFileOutput(fileName,MODE):第一个参数是文件的名字,第二个参数是权限,权限可以叠加的。
    如果希望文件被其他应用读和写,可以传入:
    MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE,也就是说,权限是可以合理地叠加在一起。
    ------------------
    当应用程序在安装时,系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库应该都是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了MODE_WORLD_READABLE 或者 MODE_WORLD_WRITEABLE。

     1 public class MainActivity extends ActionBarActivity {
     2     EditText editText;
     3     Button button;
     4     TextView textView;
     5 
     6     @Override
     7     protected void onCreate(Bundle savedInstanceState) {
     8         super.onCreate(savedInstanceState);
     9         setContentView(R.layout.fragment_main);
    10         editText = (EditText) findViewById(R.id.editText1);
    11         button = (Button) findViewById(R.id.button1);
    12         textView = (TextView) findViewById(R.id.textView1);
    13         button.setOnClickListener(new OnClickListener() {
    14 
    15             @Override
    16             public void onClick(View v) {
    17                 // TODO Auto-generated method stub
    18                 WriteFile(editText.getText().toString());
    19                 textView.setText(readFile());
    20             }
    21         });
    22     }
    23 
    24     // 保存文件内容
    25     public void WriteFile(String content) {
    26 
    27         FileOutputStream fos;
    28         try {
    29             fos = openFileOutput("a.txt", MODE_PRIVATE);
    30             fos.write(content.getBytes());
    31 
    32             fos.close();
    33         } catch (IOException e) {
    34             // TODO Auto-generated catch block
    35             e.printStackTrace();
    36         }
    37 
    38     }
    39 
    40     // 读取文件内容
    41 
    42     public String readFile() {
    43         String content = null;
    44 
    45         try {
    46             FileInputStream fis = openFileInput("a.txt");
    47             ByteArrayOutputStream baos = new ByteArrayOutputStream();
    48             byte[] buffer = new byte[1024];
    49             int len = 0;
    50             while ((len = fis.read(buffer)) != -1) {
    51                 baos.write(buffer, 0, len);
    52             }
    53             content = baos.toString();
    54             fis.close();
    55             baos.close();
    56         } catch (IOException e) {
    57             // TODO Auto-generated catch block
    58             e.printStackTrace();
    59         }
    60 
    61         return content;
    62     }
    63 }







  • 相关阅读:
    第一周作业
    第0次作业
    IOS和Android解析newDate()不兼容问题
    行 1: <%@ Application Codebehind="Global.asax.cs" Inherits="FuceFP.Web.Global" Language="C#" %>
    The edge module has not been pre-compiled for node.js version v6.11.2. You must build a custom version of edge.node. Please refer to https://github.com/tjanczuk/edge for building instructions.
    无法确定条件表达式的类型,因为Datetime和<null>之间没有隐式转换
    VS Android Cordova 环境搭建 Java SDK/AVD Manager 闪退
    机器学习系列(3) 决策树
    python系列(2) 函数
    MYSQL系列(4) 窗口函数解决连续几天登录的问题
  • 原文地址:https://www.cnblogs.com/my334420/p/6730825.html
Copyright © 2020-2023  润新知