目录
- 安卓数据处理
- 持久化存储的种类
- File数据存储
- 资源存储(Assets中的数据处理)
- 内部存储
- 外部存储
安卓数据处理
- 瞬时数据:存储到内存当中,回因为程序关闭或其他原因导致内存被回收而丢失。
- 持久化数据:存储到介质中,即时在关机情况下,数据仍不会丢失。用于存储图片缓存,用户信息等。
持久化存储的种类
- 资源存储
- 文件存储(内部存储、外部存储)
文件存储 | 空间容量 | 存储位置 | 访问权限 | 应用场景 |
内部存储 | 小 | /data/data/<package_name>/files | APP内部 | 存储用户账号密码等 |
外部存储 | 大 | 外部所有目录 | 均可以访问 | 存储图片、视频等 |
- SharedPreferences存储
- 数据库存储
- Content Provider存储
注意:粗体为本篇文章将讲述内容,其余的会在接下来的文章中补充。
File数据存储
资源存储(Assets中的数据处理)
- Android Studio中assets目录位置:app/src/main/assets
- assets中文件不会被编译
- 占用APK体积
1.通过AssetManager读取数据:context.getAsset().open(fileName)
/**
* 读取Assets中的文件
*/
@Nullable
private String readAssetsContent(String fileName) {
InputStream fis = null;
BufferedReader reader = null;
try {
fis = this.getAssets().open(fileName);//this.getAssets()方法读取AssetsManager
reader = new BufferedReader(new InputStreamReader(fis));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) !=null){
builder.append(line);
}
return builder.toString();
} catch (IOException e) {
e.printStackTrace();
}finally {
//关闭操作
try {
if (fis!=null){
fis.close();
}
if (reader !=null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
2. 通过文件路径读取数据:file:///android_asset/fileName
mWebView = findViewById(R.id.webview);
mWebView.loadUrl("file:///android_asset/macardo.txt");
内部存储
- 内部存储!=内存(是外存上的一片空间,指存储在APP包内的一片空间)
- 特点:只能被自己应用访问,空间有限
- 存储位置:/data/data/<package_name>/files
- 操作模式:MODE_PRIVATE&MODE_APPEND
MODE_PRIVATE:新内容覆盖旧内容
MODE_APPEND:新内容追加到旧内容后面
private boolean savetoInternalFile(String fileName, String content,boolean isAppend) {
if (fileName == null||fileName.length() ==0 || content == null || content.length() ==0){
return false;
}
FileOutputStream fos = null;
try {
if (isAppend) {
fos = openFileOutput(fileName, MODE_APPEND);
}else {
fos = openFileOutput(fileName, MODE_PRIVATE);
}
fos.write(content.getBytes());
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fos!=null){
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
private String readFromInternalFile(String fileName) {
FileInputStream fis = null;
BufferedReader reader = null;
try {
fis = openFileInput(fileName);
reader =new BufferedReader(new InputStreamReader(fis));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null){
builder.append(line);
}
return builder.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fis != null){
fis.close();
}
if (reader != null){
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
外部存储
- 特点:即可公有又可私有,空间相对充足
- 存储位置:
公有:Environment.getExternalStorageDirectory()
私有:/Android/data/<package_name>/files - 权限申请:
//读取外部文件权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
//写入外部文件权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
注意:targetSdkVersion >= 23 需要进行权限的动态申请,因为Android6.0之后加强了权限的管理机制,在Android6.0以上的设备需要进行动态申请。
//动态检查文件权限
private void checkFilePermission() {
//PERMISSION_GRANTED为获取到的权限
if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED){
//未获取到文件的权限
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},REQ_CODE_FILE);//REQ_CODE_FILE = 1
}
}
private boolean checkExternalState(){
//MEDIA_MOUNTED:SD卡正常挂载,并且挂载点可读/写
//Environment.getExternalStorageState:获取外部存储的状态
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQ_CODE_FILE && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,"成功获取文件权限",Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(this,"未获取文件权限",Toast.LENGTH_SHORT).show();
}
}
Github项目地址: Macardo/Data-Handling.