Android下的数据储存方式( 二)

 

在上一篇文章中我们介绍了SharedPreferences的使用方法。

今天我们继续介绍另一种储存数据的方式:使用内部储存和外部储存

 

每一个Android设备都拥有两个数据储存区域:外部储存和外部储存

那么我们应该采用哪种储存方式呢?

我们先对比一下这两种储存方式的不同:

内部储存:

  • 总是可用的
  • 保存在这里的文件只能被你的app访问
  • 当程序被卸载的时候,系统会删除所有属于该应用的文件

    当你不希望你的文件被其他人或应用访问到的时候,内部储存是最好的选择

外部储存:

  • 当sd卡被用户卸载的时候不可用,因此可能需要做额外的检测动作
  • 外部储存可被所有人或应用读取,安全性差
  • 当应用被卸载的时候,只有保存在通过getExternalFilesDir()获取的路径上的文件被删除

    当储存空间紧缺和文件的访问不需要被限制的时候,外部储存是最好的选择

保存文件到内部储存

文件的操作主要用到java的io包里面的类。

要获取属于你的程序的储存空间,可以使用下面的两个方法:

getFilesDir()

          返回一个File类型的内部储存路径

getCacheDir()

          返回一个File类型的内部临时储存路径

 

先看一下运行效果:

a

 

运行完毕到Eclipse的ddms视图就可以看到文件已经被写入:

 

image

 

详细代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.whathecode.storageoptinos;
 
import java.io.FileOutputStream;
 
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class MainActivity extends Activity
{
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        final EditText namefield = (EditText) findViewById(R.id.username);
        final EditText agefield = (EditText) findViewById(R.id.age);
 
        Button btnWrite = (Button) findViewById(R.id.write);
 
        SharedPreferences spf = getSharedPreferences("record", MODE_PRIVATE);
        // 获取编辑器
        final SharedPreferences.Editor editor = spf.edit();
 
        btnWrite.setOnClickListener(new View.OnClickListener()
        {
 
            @Override
            public void onClick(View v)
            {
                String filename = "person.txt";
                // File file = new File(getBaseContext().getFilesDir(),
                // filename);
 
                String username = namefield.getText().toString();
                String age = agefield.getText().toString();
 
                try
                {
                    FileOutputStream openFileOutput = openFileOutput(filename,
                            Context.MODE_PRIVATE);
 
                    openFileOutput.write(username.getBytes());
                    openFileOutput.write(age.getBytes());
 
                    openFileOutput.close();
 
                    Toast.makeText(getBaseContext(),
                            "file saved at " + getFilesDir().toString(),
                            Toast.LENGTH_LONG).show();
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        });
    }
}

 

保存文件到外部储存

和内部储存不同,写文件到外部储存需要在AndroidManifest文件中获取相应的权限。

 

1
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

当你的程序获得了写外部储存的权限的时候,同时隐式地获得读的权限,因此不需要另外添加读的权限。

 

运行结果:

a

 

程序代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package com.whathecode.storageoptinos;
 
import java.io.File;
import java.io.FileOutputStream;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
public class MainActivity extends Activity
{
 
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        final EditText namefield = (EditText) findViewById(R.id.username);
        final EditText agefield = (EditText) findViewById(R.id.age);
 
        Button btnWrite = (Button) findViewById(R.id.write);
 
        btnWrite.setOnClickListener(new View.OnClickListener()
        {
 
            @Override
            public void onClick(View v)
            {
                String filename = "person.txt";
 
                String externDir = getExternalFilesDir(null).toString();
                // 准备数据写入
                String username = namefield.getText().toString();
                String age = agefield.getText().toString();
 
                // 判断sd卡是否挂载,sd卡存在则开始写入文件
                if (Environment.getExternalStorageState().equals(
                        Environment.MEDIA_MOUNTED))
                {
                    try
                    {
                        FileOutputStream fos = new FileOutputStream(new File(
                                externDir, filename));
                        fos.write(username.getBytes());
                        fos.write(age.getBytes());
 
                        fos.close();
 
                        Toast.makeText(getBaseContext(),
                                "file saved at " + externDir, Toast.LENGTH_LONG)
                                .show();
                    } catch (Exception e)
                    {
                        e.printStackTrace();
                    }
 
                } else
                {
                    Toast.makeText(getBaseContext(), "SD卡不存在",
                            Toast.LENGTH_SHORT).show();
                }
 
            }
        });
 
    }
}

文件保存路径:

image

posted @   破代码  阅读(454)  评论(0)    收藏  举报
编辑推荐:
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 电商平台中订单未支付过期如何实现自动关单?
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
阅读排行:
· 如果单表数据量大,只能考虑分库分表吗?
· 一款让 Everything 更加如虎添翼的 .NET 开源辅助工具!
· (原创)[开源][.Net Framework 4.5] SimpleMVVM(极简MVVM框架)更
· 冲压车间软件实施
· 干货分享!MCP 实现原理,小白也能看懂
点击右上角即可分享
微信分享提示