最近利用下班时间,找了看什么书比较适合初学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,运行结果

第一步:运行程序

                              

第一行代码android第2版pdf彩色 第一行安卓代码第二版pdf_权限

第二步:点击“读取SDCard数据”按钮

                              

第一行代码android第2版pdf彩色 第一行安卓代码第二版pdf_读写文件_02

第三步:编辑要保存文件

                              

第一行代码android第2版pdf彩色 第一行安卓代码第二版pdf_数据持久化_03

第四步:点击“保存文件”按钮

                              

第一行代码android第2版pdf彩色 第一行安卓代码第二版pdf_android_04

第五步:点击“读取文件”按钮

                              

第一行代码android第2版pdf彩色 第一行安卓代码第二版pdf_权限_05

第六步:修改文件名为“why.txt”,点击“读取文件按钮”

                               

第一行代码android第2版pdf彩色 第一行安卓代码第二版pdf_sdcard_06

第七步:查看控制台数据

第一行代码android第2版pdf彩色 第一行安卓代码第二版pdf_android_07