首先需要明确:对于高版本的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();
}