鉴于实现android文件读写的惨痛经历,我决定将其实现过程写下来。其实网站上关于这方面的博客、讨论很多,我也看了很多,但都不太完整(也可能是我没看明白),导致我在这个问题上纠结了足足4天,在完成前1小时,我甚至想怒摔平板(原因是我要root它,但下载的5、6个应用都未能root成功,官方论坛给的root链接共享盘居然过期?实力心疼自己)。当然也有我自身原因,因为我是刚从web过来做android开发,近三年也没用过安卓手机、平板类的设备,导致我开始时都忘了安卓机是有文件管理器的。。。。。。
好了,废话不多说,正式开始
权限配置,在AndroidManifest.xml中添加外设存储的读写权限。android的权限主要分为两类,普通权限和危险权限(其实还有第三类特殊权限),如果是申请普通权限,只用在AndroidManifest.xml中添加一下权限声明就可以了,因为系统会自动进行授权。但如果是危险权限,则还需进行运行时权限处理。
权限运行时申请,本次使用的外设存储的读写权限是属于危险类权限,所以必须进行运行时权限处理。先判断是否拥有读写权限,若没有则先申请权限。然后重写onRequestPermissionsResult方法,当申请权限成功后,即执行写文件方法。
if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_DENIED) {
ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
} else {
writeDataFile();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
writeDataFile();
} else {
Toast.makeText(this, "申请权限失败", Toast.LENGTH_SHORT).show();
}
}
}
文件写入
private void writeDataFile() {
BufferedWriter writer = null;
FileWriter fileWriter=null;
String fileName="";
try {
fileName="info.txt";
File newFile = new File(Environment.getExternalStorageDirectory(), fileName);
fileWriter = new FileWriter(newFile, false);
writer = new BufferedWriter(fileWriter);
writer.write("Hello World");
writer.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null) {
try {
fileWriter.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
文件读取
public ArrayList readFileData(){
ArrayList arrayList=new ArrayList<>();
BufferedReader reader=null;
FileReader fileReader=null;
File file=new File(Environment.getExternalStorageDirectory(),"info.txt");
try {
fileReader=new FileReader(file);
reader=new BufferedReader(fileReader);
String line="";
while ((line=reader.readLine())!=null){
arrayList.add(line);
}
return arrayList;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}