各位看官们大家好,上一回中咱们说的是Android中数据存储之文件的例子,这一回咱们继续说该例子。闲话休提,言归正转。让我们一起Talk Android吧!
看官们,我们通过四个章回的内容对文件这种数据存储方式进行了介绍,主要介绍了文件的读写操作,其中每种操作使用了Java和Android两种API来实现。这一回中做一个大结局式的总结:
文件操作有两种方式:
- 使用Java提供的API;
- 使用Android提供API。
它们的共同点就是都可以对文件进行读写操作,它们的不同点如下:
- 创建输入/出流的方式不同;
- java的文件路径可以自己定义,android的文件路径只能使用默认的。
- Java需要申请文件操作权限,而android不需要。
看官们,我们创建了一个工程并且在工程中通过点击Button的方式来读写文件,下面是所有操作的完整代码,请大家参考:
package com.example.talk8.blogappall;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class ActivityFile extends AppCompatActivity {
private static final String TAG = "DataStorage";
private Button mReadByJava;
private Button mWriteByJava;
private Button mReadByAndroid;
private Button mWriteByAndroid;
//临时文件名称,其中包含文件路径,使用Java IO需要带上路径,不然有异常
//private String mFileName = "/sdcard/Download/temp_file.txt";
//临时文件名称,其中不包含文件路径,使用Android IO不需要带上路径,不然有异常
private String mFileName = "temp_file.txt";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file);
mReadByJava = (Button)findViewById(R.id.read_by_java);
mWriteByJava = (Button)findViewById(R.id.write_by_java);
mReadByAndroid = (Button)findViewById(R.id.read_by_android);
mWriteByAndroid = (Button)findViewById(R.id.write_by_android);
mWriteByJava.setOnClickListener(v -> requestPermisson());
mReadByJava.setOnClickListener(v -> ReadDataByJava());
mWriteByAndroid.setOnClickListener(v -> WriteDataByAndroid());
mReadByAndroid.setOnClickListener(v -> ReadDataByAndroid());
}
public void WriteDataByJava(){
File file = new File(mFileName);
String content = "Hello";
FileOutputStream outputStream = null;
BufferedWriter bufferedWriter = null;
Log.i(TAG, "WriteDataByJava: ");
//检查文件路径是否已经存在,如果存在就创建文件
if(file != null && file.getParentFile() != null) {
if (file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
}else {
Log.i(TAG, "WriteDataByJava: File Created Failed");
return;
}
try {
outputStream = new FileOutputStream(file);
}catch (IOException e) {
e.printStackTrace();
}
//通过输出流给文件写入内容
if(outputStream != null) {
bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
try {
bufferedWriter.write(content);
}catch (IOException e) {
e.printStackTrace();
}finally {
if(bufferedWriter != null) {
try {
bufferedWriter.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
//通过输入流从文件中读取内容
public String ReadDataByJava() {
String result = null;
File file = new File(mFileName);
FileInputStream inputStream = null;
BufferedReader bufferedReader = null;
if(file.exists() && file.getParentFile().exists() ) {
try {
inputStream = new FileInputStream(file);
}catch (IOException e){
e.printStackTrace();
}
if(inputStream == null){
return null;
}
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
if(bufferedReader != null){
try {
result = bufferedReader.readLine();
}catch (IOException e) {
e.printStackTrace();
}finally {
if(bufferedReader != null) {
try{
bufferedReader.close();
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
Log.i(TAG, "ReadDataByJava, Content: "+result);
return result;
}
//通过Android提供的API向文件中写入内容
public void WriteDataByAndroid() {
String content = "this is the content of file.";
FileOutputStream file = null;
BufferedWriter bufferedWriter = null;
try{
file = openFileOutput(mFileName, Context.MODE_APPEND);
bufferedWriter = new BufferedWriter(new OutputStreamWriter(file));
bufferedWriter.write(content);
Log.i(TAG, "WriteDataByAndroid: ");
}catch (IOException e){
e.printStackTrace();
}finally {
if(bufferedWriter != null) {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//通过Android提供的API从文件中读取内容
public String ReadDataByAndroid() {
String result = null;
FileInputStream file = null;
BufferedReader bufferedReader = null;
try{
file = openFileInput(mFileName);
bufferedReader = new BufferedReader(new InputStreamReader(file));
result = bufferedReader.readLine();
}catch (IOException e) {
e.printStackTrace();
}finally {
if(bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Log.i(TAG, "ReadDataByAndroid, Content: "+result);
return result;
}
//读写文件需要先申请权限
public void requestPermisson() {
if(ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "requestPermisson: ");
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}else {
WriteDataByJava();
}
}
//用户选择权限后,对选择做处理
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 1) {
if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "onRequestPermissionsResult: Permission approved");
WriteDataByJava();
}else {
Log.i(TAG, "onRequestPermissionsResult: Permission denied");
Toast.makeText(getApplicationContext(),"Permission denied",Toast.LENGTH_LONG).show();
}
}
}
}
看官们,代码中读写文件的内容只是一个简单的字符串,这只是为了演示读写操作,在实际项目中,读
写的内容肯定不是这样。另外,我们在代码中添加了相关的log以跟踪程序运行过程;下面是点击不同按钮后程序的运行结果,请大家参考;
//按下使用Java API方式读写文件的按钮
I/DataStorage: WriteDataByJava:
I/DataStorage: ReadDataByJava, Content: Hello
//按下使用Android API方式读写文件的按钮
I/DataStorage: WriteDataByAndroid:
I/DataStorage: ReadDataByAndroid, Content: this is the conten of file
各位看官,关于Android中数据存储之文件的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!
Android文件存储详解
本文深入探讨了Android中文件存储的两种方法:使用Java API和Android API。对比了两种方式的异同,包括文件路径处理、权限申请等,并提供了完整的代码示例。
8479

被折叠的 条评论
为什么被折叠?



