Android下的数据储存方式( 二)
在上一篇文章中我们介绍了SharedPreferences的使用方法。
今天我们继续介绍另一种储存数据的方式:使用内部储存和外部储存
每一个Android设备都拥有两个数据储存区域:外部储存和外部储存
那么我们应该采用哪种储存方式呢?
我们先对比一下这两种储存方式的不同:
内部储存:
- 总是可用的
- 保存在这里的文件只能被你的app访问
- 当程序被卸载的时候,系统会删除所有属于该应用的文件
当你不希望你的文件被其他人或应用访问到的时候,内部储存是最好的选择
外部储存:
- 当sd卡被用户卸载的时候不可用,因此可能需要做额外的检测动作
- 外部储存可被所有人或应用读取,安全性差
- 当应用被卸载的时候,只有保存在通过getExternalFilesDir()获取的路径上的文件被删除
当储存空间紧缺和文件的访问不需要被限制的时候,外部储存是最好的选择
保存文件到内部储存
文件的操作主要用到java的io包里面的类。
要获取属于你的程序的储存空间,可以使用下面的两个方法:
getFilesDir()
返回一个File类型的内部储存路径
getCacheDir()
返回一个File类型的内部临时储存路径
先看一下运行效果:
运行完毕到Eclipse的ddms视图就可以看到文件已经被写入:
详细代码:
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" /> |
当你的程序获得了写外部储存的权限的时候,同时隐式地获得读的权限,因此不需要另外添加读的权限。
运行结果:
程序代码:
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(); } } }); } } |
文件保存路径:
分类:
android入门
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次 .NET某云HIS系统 CPU爆高分析
· 如果单表数据量大,只能考虑分库分表吗?
· 一文彻底搞懂 MCP:AI 大模型的标准化工具箱
· 电商平台中订单未支付过期如何实现自动关单?
· 用 .NET NativeAOT 构建完全 distroless 的静态链接应用
· 如果单表数据量大,只能考虑分库分表吗?
· 一款让 Everything 更加如虎添翼的 .NET 开源辅助工具!
· (原创)[开源][.Net Framework 4.5] SimpleMVVM(极简MVVM框架)更
· 冲压车间软件实施
· 干货分享!MCP 实现原理,小白也能看懂