2021-04-14

外部存储ExternalStorage

首先要分请一下几个概念:
内存 Memory
内部存储 InternalStorage
外部存储 ExternalStorage
(请自行百度一下)

直接来看一下效果吧:
一、一个简单的editText输入数据,一个textview显示输入的数据(我之前有做测试所以后面的文档内容比较随意)
在这里插入图片描述
二、下面我先贴一个xml的代码:
1、其中两个button的onclick都是oprate方法:之后在.java中调用时会用到switch(view.getid)去做选择,所以这里说明一下:
在这里插入图片描述
2、.java代码:

package com.example.shujucuncu;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


public class ExternalStorage extends AppCompatActivity {
    private EditText Edit;
    private TextView show_txt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_external_storage);
        Edit = findViewById(R.id.Edit);
        show_txt = findViewById(R.id.show_txt);

    }

    public void operate(View view) {
        //创建文件路径
        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Documents/ex.txt";
      Log.d("xxx",path);
        switch (view.getId()) {
            case R.id.save_btn:
                //创建一个文件
                File file = new File(path);
                try {
                    //判断文件是否存在,没有存在则创建一个新的文件
                    if (!file.exists()) {
                        file.createNewFile();
                    }
                    //创建一个文件输出流,写入文件是一个输出流(参数一 路径 参数二 是否增加txt)
                    FileOutputStream fos = new FileOutputStream(path, true);
                    //创建一个字符串是去get输入框的内容
                    String str = Edit.getText().toString();
                    //将str写入fos,write的类型是byte所以要getBytes()
                    fos.write(str.getBytes());
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
                break;
            case R.id.read_btn:
                try {
                    //创建一个输入流文件
                    FileInputStream fis = new FileInputStream(path);
                    //byte类型的数组,长度为1024
                    byte[] b = new byte[1024];
                    //read();方法会将读取到的字节存入缓存数组b,并且return一个int类型的已经读取过字节的数组b的长度所以在这里我们定义的是一个int类型的len;
                    int len = fis.read(b);
                    String str2 = new String(b, 0, len);
                    show_txt.setText(str2);

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
                break;
        }
    }

}

3、代码涉及到输入流与输出流所以要在AndroidManifest.xml中设置权限代码:

 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
        tools:ignore="ProtectedPermissions" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

问题

这段代码在虚拟机上运行没有问题,但在真机测试上还存在问题不能运行,我还在查找解决办法,之后会在追加在这里,所以如果你有解决办法请一定给我留言🙏

上述问题解决方法

之前我的问题在于直接用Environment.getExternalStorageDirectory() 目录,Android 在最新几个版本存储这块控制得很严,将它改成getExternalCacheDir() 目录就可以。还是将修改后的代码贴出来:

package com.example.shujucuncu;

import android.Manifest;
import android.content.Context;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;


public class ExternalStorage extends AppCompatActivity {
    private EditText Edit;
    private TextView show_txt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_external_storage);
        Edit = findViewById(R.id.Edit);
        show_txt = findViewById(R.id.show_txt);

        checkNeedPermissions();
    }

    //动态权限的方法  手机版本6.0以上要动态的申请手机权限
    private void checkNeedPermissions() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            //多个权限一起申请
            ActivityCompat.requestPermissions(this, new String[]{
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.READ_EXTERNAL_STORAGE
            }, 1);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1) {
            //处理请求码为1时的权限处理
        }
    }

    public void operate(View view) {
        File file = new File(getExternalCacheDir(), "ex.txt");
        Log.d("yyy", String.valueOf(file));
        //存储的路径为:/storage/emulated/0/Android/data/com.example.shujucuncu/cache/ex.txt

        switch (view.getId()) {
            case R.id.save_btn:
                try {
                    //判断文件是否存在,没有存在则创建一个新的文件
                    if (!file.exists()) {
                        file.createNewFile();
                    }
                    //创建一个文件输出流,写入文件是一个输出流(参数一 路径 参数二 是否增加txt)
                    FileOutputStream fos = new FileOutputStream(file);
                    //创建一个字符串是去get输入框的内容
                    String str = Edit.getText().toString();
                    //将str写入fos,write的类型是byte所以要getBytes()
                    fos.write(str.getBytes());
                    fos.flush();
                    fos.close();
                    Toast.makeText(ExternalStorage.this, "save success", Toast.LENGTH_SHORT).show();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
                break;
            case R.id.read_btn:
                try {
                    //创建一个输入流文件
                    FileInputStream fis = new FileInputStream(file);
                    //byte类型的数组,长度为1024
                    byte[] b = new byte[1024];
                    //read();方法会将读取到的字节存入缓存数组b,并且return一个int类型的已经读取过字节的数组b的长度所以在这里我们定义的是一个int类型的len;
                    int len = fis.read(b);

                    String str2 = new String(b, 0, len);
                    show_txt.setText(str2);
                    fis.close();
                    Toast.makeText(ExternalStorage.this, "read success", Toast.LENGTH_SHORT).show();

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException ioException) {
                    ioException.printStackTrace();
                }
                break;
        }
    }


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值