Android数据存储————文件存储(外部存储)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_29675423/article/details/85705545

上一篇:Android数据存储————文件存储(内部存储):https://blog.csdn.net/sinat_29675423/article/details/85699131

存储特征

将数据存储在app目录下,保存到外部存储设备,比如SD卡中,数据既可以公有,也可以私有,空间相对充足。

存储路径

公有:Environment.getExternalStorageDirectory()
在这里插入图片描述

私有:/Android/data/<package_name>/files

在这里插入图片描述

注意:外部存储权限

访问外部存储权限,API 23以上的应用程序,需要动态申请 外部存储权限
这里推荐使用动态权限处理框架:Easypermission,官方说明:https://github.com/googlesamples/easypermissions

例子:存储、读取字符串

将输入框中的字符串保存到内部存储路径中,并且读取存储的字符串到文本框中显示。

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
   >
    <EditText
        android:id="@+id/etNote"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="text"/>
    <Button
        android:id="@+id/btnSave"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存"
        android:onClick="onClick"/>
    <Button
        android:id="@+id/btnGet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="读取"
        android:onClick="onClick"/>
    <TextView
        android:id="@+id/tvContent"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

权限配置

应用easypermission框架,在app:gradle中添加:

dependencies {
    implementation 'pub.devrel:easypermissions:2.0.0'
}

manifest配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="你的包名">
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity: 实现存储和读取,外部存储权限处理


public class MainActivity extends AppCompatActivity implements View.OnClickListener,EasyPermissions.PermissionCallbacks {

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

        mEtNote = findViewById(R.id.etNote);
        mTvNote = findViewById(R.id.tvContent);
        btnGet = findViewById(R.id.btnGet);
        btnSave = findViewById(R.id.btnSave);
        //权限处理
        String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE};
        if(!EasyPermissions.hasPermissions(this,perms)){
            EasyPermissions.requestPermissions(this,"需要外部存储权限",0,perms);
        }

    }


    private EditText mEtNote;
    private TextView mTvNote;
    private Button btnSave,btnGet;

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnSave:
                //保存编辑器里面的字符串到文件中
                String content = mEtNote.getText().toString().trim();
                Boolean success = saveToExternalFile("hello","mynote.txt", content);
                //提示是否保存成功
                if (success) {
                    Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this,"保存失败",Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.btnGet:
                //读取文件内容,显示在文本框中
                String res = readFromExternalFile("hello","mynote.txt");
                mTvNote.setText(res);
        }
    }

    /**
     * 从外部存储设备中读取
     * @param dirName 文件夹
     * @param filename 文件名
     * @return
     */


    @Nullable
    private String readFromExternalFile(String dirName, String filename) {
        //检查外部存储设备
        if(!checkExternalState()){
            return null;
        }
        String externalPath = Environment.getExternalStorageDirectory().getAbsolutePath();
        //获取文件路径
        File dir = new File(externalPath+"/"+dirName+"/");
        if (!dir.exists()){
            return  null;
        }
        FileInputStream fis = null;
        BufferedReader reader = null;
        try {
            fis = new FileInputStream(new File(dir, filename));
            reader = new BufferedReader(new InputStreamReader(fis));
            StringBuilder builder = new StringBuilder();
            String line;
            if((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;
    }

    /**
     * 存储到外部
     * @param dirName 文件夹
     * @param filename 文件名
     * @param content
     * @return
     */

    private boolean saveToExternalFile(String dirName, String filename, String content) {
        if (!checkExternalState()) {
            return false;
        }
        //获取外部存储的绝对路径
        String externalPath = Environment.getExternalStorageDirectory().getAbsolutePath();
        File dir = new File(externalPath +"/"+dirName+"/");
        if (!dir.exists()){
            //如果路径不存在就创建文件夹
            dir.mkdir();
        }
        if(filename == null || filename.length() == 0 || content == null ||content.length() == 0){
            return false;
        }
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(new File(dir, filename));
            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;
    }

    /**
     * 检查外部存储设备
     * @return
     */
    private boolean checkExternalState() {
        return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
    }

    /**
     * 获取到权限
     * @param requestCode
     * @param perms
     */
    @Override
    public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
        Log.i("Data","request code:"+requestCode);
        Toast.makeText(this,"已获取外部存储权限",Toast.LENGTH_SHORT).show();

    }

    /**
     * 权限被拒绝
     * @param requestCode
     * @param perms
     */
    @Override
    public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
        Toast.makeText(this,"拒绝外部存储权限",Toast.LENGTH_SHORT).show();
    }

    /**
     * 重写onRequestPermissionsResult,用于接受请求结果
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //将请求结果传递EasyPermission库处理
        EasyPermissions.onRequestPermissionsResult(requestCode,permissions,grantResults,this);
    }
}

展开阅读全文

没有更多推荐了,返回首页