Android10 读取和写入手机内部存储

首先需要明确:对于高版本的Android系统,内部存储和外部存储的理解是和常识相悖的。外部存储其实就是我们手机的内部存储(你手机那32,64,128和256G);

其次:在Android10后,对权限的设置进一步改变了。因此,如果还是和低版本一样申请权限,是不能操作内部存储的。

第一,申请权限

旧版本的权限申请一般如下,当然这部分还是要

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

如果要真的可以操作内部存储,还需要如下代码:

android:requestLegacyExternalStorage="true"

位置在见如下示例: 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.testandroid">

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

    <application
        android:requestLegacyExternalStorage="true"
        android:windowSoftInputMode="adjustUnspecified|stateHidden"
        android:allowBackup="true"
        android:icon="@mipmap/show"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

第二,开始操作内部存储

判断内部存储是否可读写:

//保存历史记录,判断SDcard是否存在并且可读写
 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    System.out.println("成功!");
}

判断路径是否存在,不存在则新建:

File Folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "data");
    if (!Folder.exists())
    {
        boolean mkdirs = Folder.mkdirs();
        if (!mkdirs) {
            Log.e("TAG", "文件夹创建失败");
        } else {
            Log.e("TAG", "文件夹创建成功");
    }
 }

读取txt文件:

String message = "";
String sdCardDir = Environment.getExternalStorageDirectory().getAbsolutePath();
File saveFile = new File(sdCardDir + "/data/", "history.txt");
try {

    InputStreamReader fileReader = new InputStreamReader(new FileInputStream(saveFile), "utf-8");
    BufferedReader fp = new BufferedReader(fileReader);

    String line = null;
    while ((line = fp.readLine()) != null) {
        message += line + "\n";
    }
    fp.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

写入到txt文件:这里每次添加到txt的最开始位置。因此是覆盖写入,先读取所有的文件存在message变量中,然后添加message到strview变量中覆盖写入txt

如果是在txt末尾添加,将FileOutputStream(saveFile,false),"UTF-8")设为FileOutputStream(saveFile,true),"UTF-8")

try {
    //outStream = new FileOutputStream(saveFile,true);
    //写入数据
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(saveFile,false),"UTF-8"));
    //获取当前时间
    Date date = new Date();
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy年-MM月dd日-HH时mm分ss秒 E");
    String sim = dateFormat.format(date);
    String strview=sim+outputdata.getText().toString()+"\n"+message;
//                            byte[] b=strview.getBytes();			//字符->字节==编码
    writer.write(strview);
    writer.close();
    writer.flush();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

 

 


版权声明:本文为kissgoodbye2012原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。