最近利用下班时间,找了看什么书比较适合初学android的朋友,很多人推荐了这本书,于是就买了一本,感觉看书,思考,动手,再思考和总结这样过程还是很有必要的,于是就打算把自己学习的东西简单的总结一下;方便自己以后查找,也有利于学习的巩固。在这里首先要感谢一下书籍的作者——郭霖前辈。
关于数据持久化,我在前三篇分别介绍了通过文件和SP的形式以及Android内置轻量级数据库SQLite来实现。之前介绍了三种数据持久化方法(本地文件,SharedPreferences,SQLite),今天简单说一下如何操作SDcard数据实现持久化(其实就是简单的读写文件);因为在android6.0之后读写SDcard数据是危险操作,所以在android6.0及之后手机需要加上运行时权限申请,不然不能运行呀。如何实现运行时申请权限,请参考我的另一篇博客 Android权限简单介绍
1,思路介绍
在实现此示例代码前,本来是想集成其他几种数据持久化方法做一个对比,所以导致现在示例中有两个活动,但是考虑到内容会比较多,于是就分别展开来写了,看着有点尴尬哈哈;几点需要注意的地方就是,假如我查看的文件不存在,我会重新创建一个同名无内容的文件;我在代码中也注释了直接提醒文件名不存在的实现代码;所以两种方式都可以试一下;进入操作文件活动之后,默认是编辑模式;输入文件名和相应内容点击保存即可,同名覆盖;没有提醒(可以优化,实现弹窗提醒---AlertDialog实现即可,关于其使用可查看,好吧,我的示例代码写了,暂时没有更新到博客上...);
2,示例代码
MainActivity.java代码:
package com.hfut.operationlocalfile;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void readAndEditLocalFile(View view){
intent=new Intent(this,OperationSDCardData.class);
startActivity(intent);
}
public void readAndEditSP(View view){
}
}
FileTools.java代码:
package com.hfut.operationlocalfile.FileUtils;
import android.os.Environment;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* author:why
* created on: 2018/3/16 9:05
* description:
*/
public class FileTools {
/**
* 实现编辑文件操作
*
* @param filePath:文件路径
* @param content:要写入的内容
*/
public static String editFile(String filePath, String content) {
String saveInfo="保存成功";
File file = new File(filePath);
FileOutputStream outputStream = null;
if (file.exists()) {
try {
outputStream = new FileOutputStream(file);
System.out.println("editFile:"+filePath);
outputStream.write(content.getBytes());
//System.out.println(filePath + ":文件数据编辑完成");
} catch (Exception e) {
e.printStackTrace();
saveInfo="保存失败";
}
} else {
try {
file.createNewFile();
System.out.println(filePath + ":文件创建完成");
outputStream = new FileOutputStream(file);
outputStream.write(content.getBytes());
System.out.println(filePath + ":文件数据编辑完成");
} catch (IOException e) {
e.printStackTrace();
saveInfo="保存失败";
}
finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
return "文件保存成功;文件流关闭异常";
}
}
}
return saveInfo;
}
/**
* @param filePath:文件存储路径
* @return 读取文件数据,以String形式返回
*/
public static String readFile(String filePath) {
StringBuffer stringBuffer = new StringBuffer();
File file = new File(filePath);//创建文件
if (!file.exists()) {
// return "请输入正确的文件名称";实现文件不存在就提醒,并不是就创建一个新的
editFile(filePath,"我是新创建的文件,没有数据");
} else {
System.out.println(filePath + "文件已经存在,可以直接读取文件");
}
InputStream inputStream=null;
try {
inputStream = new FileInputStream(filePath);
if (inputStream != null) {
InputStreamReader inputReader = new InputStreamReader(inputStream);
BufferedReader bufferReader = new BufferedReader(inputReader);
String line;
while ((line = bufferReader.readLine()) != null) {
stringBuffer.append(line);
}
inputStream.close();
}
} catch (Exception e) {
System.out.println("info:文件读取异常");
}
finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return stringBuffer.toString();
}
// public static String getSDCardDir(String fileName) {
// return Environment.getExternalStorageDirectory().getPath()+"/mnt/sdcard/"+fileName;
// }
}
OperationSDCardData.java代码:
package com.hfut.operationlocalfile;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.hfut.operationlocalfile.FileUtils.FileTools;
public class OperationSDCardData extends AppCompatActivity {
private EditText editFileName;
private EditText editFileContent;
private TextView fileContentDisplay;
private String path = "/mnt/sdcard/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_operation_sdcard_data);
initUI();
}
private void initUI() {
editFileName = findViewById(R.id.fileNameSDCard);
editFileContent = findViewById(R.id.fileContent);
fileContentDisplay = findViewById(R.id.SDCardDisplay);
editFileContent.setHint("请在此处编辑需要写入文件的内容");
editFileName.setHint("请在此处编辑文件名称");
}
public void saveSDCard(View view) {
editFileContent.setHint("");
String filePath = path + editFileName.getText().toString();
System.out.println("编辑文件路径:" + filePath);
String content = editFileContent.getText().toString();
System.out.println("编辑文件内容:" + content);
String saveInfo=FileTools.editFile(filePath, content);
//可以通过editFile()返回值来展现此处内容“保存成功”或者“保存失败”
fileContentDisplay.setText(saveInfo);
}
public void readSDCard(View view) {
editFileContent.setText("");
String fileName = editFileName.getText().toString();
String filePath = path + fileName;
//if(TextUtils.isEmpty(filePath))和下面判断一样的效果,建议使用
if (fileName.equals("") || fileName.equals(null)) {
fileContentDisplay.setText("请输入文件名称");
} else {
System.out.println("文件路径:" + filePath);
String tempContent=FileTools.readFile(filePath);
if(TextUtils.isEmpty(tempContent)){
fileContentDisplay.setText("文件内容为空");
}
else {
fileContentDisplay.setText(tempContent);
}
}
}
}
activity_main.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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.hfut.operationlocalfile.MainActivity">
<Button
android:layout_marginTop="20dp"
android:onClick="readAndEditLocalFile"
android:text="读写SDCard数据"
android:textAllCaps="false"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:layout_marginTop="10dp"
android:onClick="readAndEditSP"
android:text="读写SP数据"
android:textAllCaps="false"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
activity_operation_sdcard_data.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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.hfut.operationlocalfile.OperationSDCardData">
<EditText
android:id="@+id/fileNameSDCard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入文件名称" />
<EditText
android:id="@+id/fileContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入要写入内容" />
<LinearLayout
android:layout_marginTop="20dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:onClick="saveSDCard"
android:id="@+id/editSDCard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="180dp"
android:text="保存文件" />
<Button
android:onClick="readSDCard"
android:id="@+id/readSDCard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:text="读取文件" />
</LinearLayout>
<TextView
android:layout_marginTop="20dp"
android:id="@+id/SDCardDisplay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="文件数据" />
</LinearLayout>
主配置文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hfut.operationlocalfile">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_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">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".OperationSDCardData"></activity>
</application>
</manifest>
3,运行结果
第一步:运行程序
第二步:点击“读取SDCard数据”按钮
第三步:编辑要保存文件
第四步:点击“保存文件”按钮
第五步:点击“读取文件”按钮
第六步:修改文件名为“why.txt”,点击“读取文件按钮”
第七步:查看控制台数据