项目短视频
操作示范如下(时长18:21)

【例5-2】 从SD卡读取并写入文件示例
将文件存储到外部设备上,如SD卡。外部存储的文件可被其他app共享,这些文件可被浏览、修改和删除。使用外部设备前用Environment的方法getExternalStorageState()来确认外部设备是否可用。
布局文件 activity_sd.xml的源代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_share_preference"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"
android:weightSum="1">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/btn_Save"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:onClick="Click"
android:text="存入sdcard"
android:textSize="24sp" />
<Button
android:id="@+id/btn_Get"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:onClick="Click"
android:text="取出sdcard"
android:textSize="24sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="20dp">
</LinearLayout>
<TextView
android:id="@+id/txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.44"
android:textSize="24sp" />
</LinearLayout>
控制文件SdFileActivity.java源代码
package com.example.chap05;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import androidx.core.app.ActivityCompat;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class SdFileActivity extends Activity {
Button saveBtn, getBtn;
TextView txt;
static final String fileName = "data.txt";
String data;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sd);
txt = (TextView) findViewById(R.id.txt);
saveBtn = (Button) findViewById(R.id.btn_Save);
getBtn = (Button) findViewById(R.id.btn_Get);
saveBtn.setOnClickListener(new mClick11());
getBtn.setOnClickListener(new mClick12());
data = getString(R.string.hello);
verifyStoragePermissions(this);
}
// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
public static void verifyStoragePermissions (Activity activity) {
// Check if we have write permission
int permission =
ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
// We don't have permission so prompt the user
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
//按钮事件
class mClick11 implements OnClickListener {
public void onClick(View arg0) {
//获取外部设备
String state= Environment.getExternalStorageState();
//判断外部设备是否可用
FileOutputStream fos = null;
if(state.equals(Environment.MEDIA_MOUNTED)){
//获取SD卡目录
File SDpath = Environment.getExternalStorageDirectory();
File file = new File(SDpath,fileName);
try{
fos = new FileOutputStream(file);
fos.write(data.getBytes());
fos.close();
txt.setText("保存成功,文件名:" + fileName+
"\n文件内容:\n" + data);
}catch (Exception e){e.printStackTrace();}
}
}
}
//按钮事件
class mClick12 implements OnClickListener {
public void onClick(View arg0) {
String state = Environment.getExternalStorageState();
FileInputStream fis = null;
if(state.equals(Environment.MEDIA_MOUNTED)){
File SDPath = Environment.getExternalStorageDirectory();
File file = new File(SDPath,fileName);
try{
fis=new FileInputStream(file);
byte[] buffer =new byte[fis.available()];
int bytes=fis.read(buffer);
String str = new String(buffer);
txt.setText("\n读取成功,文件名:" + fileName+
"\n文件内容:\n" + str);
}catch(Exception e){e.printStackTrace();}
}
}
}
}
打开项目配置文件AndroidManifest.xml,添加SD卡的读写权限,修改工程要启动的Activity类名
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.chap05">
<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=".SdFileActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>

