最佳拍档之内部存储和外部存储(sdcard)

大家晚上好,今天如期而至,我开始分享学到的好东西了,给大家讲的是最佳拍档----内部存储和外部存储,其中外部储存值得是sd卡存储,这两种存储文件方式是很常用到,有个优点就是它们两个都是私有的,安全性高,当你卸载一个app时,同样也会把存入的文件删除掉。好了,废话不多说,直接上运行界面。

界面就不多说了,很简单,就是用线性布局设置,然后设置需要id属性的控件就OK了。我做这个用到了两个java文件做的,MainActivity.java和fileMethod.java业务层方法。

2.MainActivity.java

private EditText body_et;
 private EditText body_et2;
 private Context context;

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  // 初始化
  body_et = (EditText) findViewById(R.id.body_et);
  body_et2 = (EditText) findViewById(R.id.body_et2);
  context = this;

 }

 /**
  * 写内存按钮事件
  */
 public void wirteFile(View v) {

  try {

//获取输入框输入值
   String edit = body_et.getText().toString();

//调用fileMethod方法,因为fileMethod方法用了构造方法,所以这里要new出来,把edit参数传过去
   fileMethod fm = new fileMethod(context);

   fm.wirteFileMethod(edit);

//吐司
   Toast.makeText(context, "写入内部存储成功", Toast.LENGTH_SHORT).show();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

 /**
  * 读内存文件的数据
  */
 public void readFile(View v) {

//调用方法
  fileMethod fm = new fileMethod(context);
  try {

//调用方法有return值,这里可以打得返回的数据
   String data = fm.readFileMethod();

//在显示框显示数据,setText

   body_et2.setText(data);

  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 /**
  * 写数据到sdcard
  */
 public void writeSdcard(View v) {

  String edit = body_et.getText().toString();

//调用方法,把edit参数传过去
  fileMethod fm = new fileMethod(context);
  try {
   fm.writeSdcardMethod(edit);
   Toast.makeText(context, "写入sdcard成功", Toast.LENGTH_SHORT).show();
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

 /**
  * 读sdcard数据
  */
 public void readSdcard(View v) {


  fileMethod fm = new fileMethod(context);
  try {
   String data = fm.readSdcardMethod();
   body_et2.setText(data);

  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

}

2.fileMethod.java业务层方法


public class fileMethod {
 private Context context;

 /**
  * 构造方法,初始化context上下文,解析一下上下文,上下文是一个环境,里面有变量还有数据,还有很多其他的,它同时也是一个类,有很多方法,比如文件夹的路径,文件夹资源.....
  */
 public fileMethod(Context context) {
  this.context = context;
 }

 /**
  * 写入内存方法
  */
 public void wirteFileMethod(String edit) throws Exception {
  //输出流写入数据,用openFileOutput,这就要contex获取其方法,参数一:生成文件的命名,参数二:文件访问的模式,这里是私有
  FileOutputStream openFileOutput = context.openFileOutput("huanxi.txt",
    context.MODE_PRIVATE);

//写入数据,edit.getByites()转换为byte类型
  openFileOutput.write(edit.getBytes());

//关闭流
  openFileOutput.close();

 }

 /**
  * 读取文件的方法
  */
 public String readFileMethod() throws Exception {

//构建File对象,参数一:文件的路径,默认为data/data/<包名>/files,参数二:文件名

  File flie = new File(context.getFilesDir(), "huanxi.txt");
  //输入流读取文件
  FileInputStream fis = new FileInputStream(flie);

//构建BuffeedReader对象
  BufferedReader br = new BufferedReader(new InputStreamReader(fis));
  //获取一行的字符型
  String str = br.readLine();
  fis.close();

//把数据返回出去
  return str;

 }

 /**
  * 写数据到外部内存的步骤

1.检测外部内存sdcard是否是挂载状态

 2.设置好存放路径

 3.开辟输出流,写入数据
 4.设置权限
  */

 public void writeSdcardMethod(String edit) throws Exception {
 //检测sdcard是否是挂载状态
  if (Environment.getExternalStorageState().equals(
    Environment.MEDIA_MOUNTED)) {
   //设置文件存放路径
   File rootPath = Environment
     .getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
   File file = new File(rootPath, "huanxi.txt");
   //创建输出流,写入数据
   FileOutputStream fos = new FileOutputStream(file);
   fos.write(edit.getBytes());
   fos.close();

  }

 }

 /**
  *
  *读sdcards数据
  */
 public String readSdcardMethod() throws Exception {

//找到存放文件的路径
   File rootPath = Environment
     .getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
   File file = new File(rootPath, "huanxi.txt");

//输入流读取数据
   FileInputStream fis = new FileInputStream(file);

//创建BufferedReader对象
   BufferedReader br = new BufferedReader(new InputStreamReader(fis));

//读取一行的数据
   String str = br.readLine();

  //读取每一行的数据
   // ByteArrayOutputStream bai=new ByteArrayOutputStream();
   // byte[]buf=new byte[2048];
   // int len=0;
   // while((len=fis.read(buf))>0){
   // bai.write(buf, 0, len);
   // }

//返回值

   return str;

 }

}

3.AndroidManifest.xml配置文件

//写入内存卡和是否是挂载状态的配置

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


今天两种存储文件的方法就讲到这了,希望友友看完之后能有一点点收获就值得,我辛苦的打字了,好,今天就到这里了,梦想在靠近,你努力了吗?晚安。




Android原生应用中,如果需要清除SD卡的内部存储空间,通常会涉及到管理应用程序数据或者文件系统操作。这里提供一种简单的方法,但请注意,这仅适用于清除应用自身的缓存和数据: 1. **使用FileProvider** 和 `delete()` 方法: 使用`java.io.File` 和 `FileProvider.delete()` 来删除特定路径下的文件或目录。首,确保你有权限访问SD卡,通过AndroidManifest.xml中添加 `<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />`。 ```java File cacheDirectory = new File(getExternalCacheDir(), "your_directory_name"); if (cacheDirectory.exists()) { deleteRecursively(cacheDirectory); } private void deleteRecursively(File directory) { if (!directory.isDirectory()) { directory.delete(); } else { for (File file : directory.listFiles()) { deleteRecursively(file); } directory.delete(); } } ``` 2. **使用SQLite数据库迁移工具**: 如果你需要清理数据库,可以考虑在用户卸载应用或清空数据时,创建一个新的迁移脚本,将旧的数据移动到新位置或者直接删除。 3. **使用ContentResolver API**: 对于媒体文件等,也可以使用`ContentResolver.delete()` 方法配合URI来删除特定类型的媒体文件,比如音乐、图片等。 但是,请注意,频繁地清理用户数据可能会导致用户体验变差,因此建议在用户明确请求或者应用后台运行清理任务时使用这种功能,并提供明显的提示。同时,在Android 6.0及以上版本,需要通过Storage Access Framework(SAF)获取用户的权限来操作外部存储
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值