Android存储卡读写文件与Application数据保存的实现介绍
1. 前言
在Android应用中,数据的存储方式主要有两种:一种是在应用内部存储中存储数据,另一种是在外部存储中存储数据。其中,存储方式不同,所需要的权限和操作也略有差异。本文将对Android存储卡读写文件与Application数据保存的实现做一个全面的介绍,包括使用示例。
2. Android存储卡读写文件
2.1 读取外部存储中的文件
在Android中,读取外部存储中的文件需要获取相应的存储权限。根据应用所需的读写权限不同,可细分为:
- 读取外部存储的公共目录(无需请求存储权限)
- 读取外部存储的私有目录(需要请求存储权限)
2.1.1 读取外部存储的公共目录
外部存储的公共目录包括:
- Environment.getExternalStoragePublicDirectory()目录方法返回的一些常用的公共目录,如“/sdcard/Pictures”,“/sdcard/Music”等。
- MediaStore.Images、MediaStore.Audio、MediaStore.Video等系统媒体库目录。
读取外部存储的公共目录的代码如下所示:
// 读取图片目录中的文件
File pictureDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File[] pictureFiles = pictureDir.listFiles();
for (File file : pictureFiles) {
// 处理文件
}
2.1.2 读取外部存储的私有目录
在Android中,每个应用有自己的私有目录,可以在其中存储和访问自己的文件。相比于读取公共目录,读取私有目录需要请求外部存储读写权限。
请求外部存储读写权限的代码如下所示:
// 判断读写权限是否已经被授予
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// 请求读写权限
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CODE);
} else {
// 读取私有目录中的文件
File privateDir = context.getExternalFilesDir(null);
File[] privateFiles = privateDir.listFiles();
for (File file : privateFiles) {
// 处理文件
}
}
2.2 写入外部存储中的文件
写入外部存储中的文件需要请求外部存储读写权限。需要注意的是,因为外部存储是与其他应用共享的,所以请务必遵守安卓的数据存储最佳实践,例如不要将敏感数据存储在外部存储中。
写入外部存储的代码如下所示:
// 判断读写权限是否已经被授予
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// 请求读写权限
ActivityCompat.requestPermissions(activity,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CODE);
} else {
// 写入文件到私有目录
File privateDir = context.getExternalFilesDir(null);
File file = new File(privateDir, "example.txt");
try {
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write("Hello, world!".getBytes());
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
3. Application数据保存
Android中,可以使用多种不同的方式存储应用程序数据,例如:
- SharedPreferences:用于存储简单的键值对数据。
- SQLite数据库:用于存储结构化的数据。
- 文件存储:用于存储文本、图片、媒体等不适合放在数据库中的数据。
3.1 SharedPreferences
SharedPreferences 提供了一种轻量级的数据存储方式,用于存储应用程序的配置信息和少量的其他数据。SharedPreferences是一个接口,其中存储的数据是以键值对的形式存储的。
读取SharedPreferences中的数据的示例代码如下所示:
SharedPreferences preferences = getSharedPreferences("example", Context.MODE_PRIVATE);
String username = preferences.getString("username", "");
int age = preferences.getInt("age", 0);
写入SharedPreferences中的数据的示例代码如下所示:
SharedPreferences preferences = getSharedPreferences("example", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("username", "张三");
editor.putInt("age", 18);
editor.apply();
3.2 SQLite数据库
SQLite数据库是Android操作系统的标准数据库,用于存储大量结构化数据。Android提供了SQLiteOpenHelper类,用于创建和管理SQLite数据库。
创建SQLiteOpenHelper类的示例代码如下所示:
public class ExampleDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "example.db";
private static final int DATABASE_VERSION = 1;
public ExampleDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 创建数据库表
db.execSQL("CREATE TABLE `user` (" +
"`id` INTEGER PRIMARY KEY AUTOINCREMENT," +
"`username` TEXT," +
"`age` INTEGER" +
")");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 数据库升级
db.execSQL("DROP TABLE IF EXISTS `user`");
onCreate(db);
}
}
对SQLite数据库进行增删改查的示例代码如下所示:
// 插入数据
ExampleDatabaseHelper databaseHelper = new ExampleDatabaseHelper(context);
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", "张三");
values.put("age", 18);
db.insert("user", null, values);
db.close();
// 查询数据
List<User> userList = new ArrayList<>();
SQLiteDatabase db = databaseHelper.getReadableDatabase();
Cursor cursor = db.query("user", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String username = cursor.getString(cursor.getColumnIndex("username"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
User user = new User(id, username, age);
userList.add(user);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
// 更新数据
SQLiteDatabase db = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("age", 20);
db.update("user", values, "username = ?", new String[]{"张三"});
db.close();
// 删除数据
SQLiteDatabase db = databaseHelper.getWritableDatabase();
db.delete("user", "username = ?", new String[]{"张三"});
db.close();
3.3 文件存储
文件存储适用于储存文本、图片、音频和视频等数据。文件存储对于小文件和常见的媒体文件非常有效。
读取文件的示例代码如下所示:
File file = new File(context.getExternalFilesDir(null), "example.txt");
try {
InputStream inputStream = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
// 处理数据
}
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
写入文件的示例代码如下所示:
File file = new File(context.getExternalFilesDir(null), "example.txt");
try {
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write("Hello, world!".getBytes());
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
4. 总结
本文介绍了Android存储卡读写文件与Application数据保存的实现方法,分别介绍了读写外部存储、SharedPreferences、SQLite数据库、文件存储。在开发Android应用时,请合理选择存储方式,并根据使用情况谨慎处理用户数据,保证数据的安全性和隐私性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android存储卡读写文件与Application数据保存的实现介绍 - Python技术站