《第一行代码》第二版 学习总结 (数据持久化附加,其他方式参考12-15) 操作SDcard数据
2018-03-24 13:35
573 查看
最近利用下班时间,找了看什么书比较适合初学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代码:
3,运行结果
第一步:运行程序
第二步:点击“读取SDCard数据”按钮
第三步:编辑要保存文件
第四步:点击“保存文件”按钮
第五步:点击“读取文件”按钮
第六步:修改文件名为“why.txt”,点击“读取文件按钮”
第七步:查看控制台数据
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>
主配置文件AndroidManidest.xml代码:
<?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”,点击“读取文件按钮”
第七步:查看控制台数据
相关文章推荐
- 《第一行代码》第二版 学习总结12 数据持久化之本地文件存储
- 《第一行代码》第二版 学习总结14 数据持久化之SQLite存储
- 《第一行代码》第二版 学习总结28 Android中子线程更新UI的三种方式
- 《第一行代码》第二版 学习总结2 Activity之间跳转与数据传送
- 《第一行代码》第二版 学习总结48 Intent传递对象两种方式
- R与数据分析学习总结之一:R语言基本操作
- mine学习及三种数据定义方式总结
- hive学习总结(2)—Hive几种导出数据方式
- 数据持久化编程学习总结
- 学习总结(15-12-8)
- 黑马程序员-IOS学习笔记-C语言基础其他数据类型及总结
- 【学习总结】iOS 数据保存几种方式总结
- Android学习笔记之数据的Sdcard存储方法及操作sdcard的工具类
- 数据持久化-存取方式总结&应用沙盒&文件管理NSFileManager
- 在学习过程中总结的LoaderManager的LoaderCallbacks刷新数据以使onLoadFinished回调方法能被执行的两种方式
- Android--数据持久化之内部存储、Sdcard存储
- MySQL 数据库表操作和数据导入导出方式总结笔记
- 基于MVC4+EasyUI的Web开发框架经验总结(12)--利用Jquery处理数据交互的几种方式
- (大数据工程师学习路径)第五步 MySQL参考手册中文版----MySQL基本操作
- Java中BigDecimal 和 BigInteger 类型数据操作学习总结