Android中的文件存储
Posted henuajy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中的文件存储相关的知识,希望对你有一定的参考价值。
一、前言
文件存储时android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因此它比较适合用于存储一些简单的文本数据或二进制数据。
二、将数据存储到文件中
Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。
可以看到,此方法接收两个参数,第一个即是文件的名字,这里不可以包含文件路径,所有的文件都是默认存储到/data/data/
下面,做一个简单的记事本Demo应用一下。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:layout_margin="5dp">
<EditText
android:id="@+id/beingSavedText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="top"
android:background="#87CEEB" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/save_text_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="保存文本"/>
<Button
android:id="@+id/cancle_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="取消保存"/>
</LinearLayout>
</LinearLayout>
MainActivity.java
package com.henuajy.savetextdemo;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity {
private String fileName = "my_text";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = findViewById(R.id.beingSavedText);
Button save_text_btn = findViewById(R.id.save_text_btn);
save_text_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = text.getText().toString();
saveText(data);
}
});
}
public void saveText(String data){
FileOutputStream os = null;
OutputStreamWriter oswriter = null;
BufferedWriter writer = null;
try {
os = openFileOutput(fileName,Context.MODE_APPEND);
oswriter = new OutputStreamWriter(os);
writer = new BufferedWriter(oswriter);
writer.write(data);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (writer!=null){
writer.close();
}
if(oswriter!=null){
oswriter.close();
}
if (os!=null){
os.close();
}
Toast.makeText(MainActivity.this,"保存成功",Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
程序运行如图:
点击保存之前,可以看到,应用数据中并没有files目录,这是因为还未曾保存过文件,到保存的时候会自动创建。
现在,随便输入一些东西,点击“保存文本”,然后再次查看应用程序目录。
哇!多了一个files目录,并且目录下多了一个my_text文件,没错,这就是我们的记事本被保存的地方。现在查看一下文件的内容:
没错,刚刚我输入了“I‘m Prodigal”。下面我们来看看如何查看文件的内容吧!
三、从文本中读取数据
类似于将数据存储到文件中,Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。
可以看到,这个方法只有需要传入一个参数,即要读取的文件的名字,然后系统会自动到/data/data/
对app进行改进,使其在加载时自动载入已存在的文件。
MainActivity.java
package com.henuajy.savetextdemo;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity {
private EditText text;
private String fileName = "my_text";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = findViewById(R.id.beingSavedText);
String beingLoadContent = loadText();
if (beingLoadContent!=null){
text.setText(beingLoadContent);
}
Button save_text_btn = findViewById(R.id.save_text_btn);
save_text_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = text.getText().toString();
saveText(data);
}
});
}
public void saveText(String data){
FileOutputStream os = null;
OutputStreamWriter oswriter = null;
BufferedWriter writer = null;
try {
os = openFileOutput(fileName,Context.MODE_APPEND);
oswriter = new OutputStreamWriter(os);
writer = new BufferedWriter(oswriter);
writer.write(data);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (writer!=null){
writer.close();
}
if(oswriter!=null){
oswriter.close();
}
if (os!=null){
os.close();
}
Toast.makeText(MainActivity.this,"保存成功",Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public String loadText(){
FileInputStream is = null;
InputStreamReader isreader = null;
BufferedReader reader = null;
StringBuilder textContent = new StringBuilder();
try{
is = openFileInput(fileName);
isreader = new InputStreamReader(is);
reader = new BufferedReader(isreader);
String line = "";
while((line=reader.readLine())!=null){
textContent.append(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (reader!=null){
reader.close();
}
if (isreader!=null){
isreader.close();
}
if (is!=null){
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
return textContent.toString();
}
}
}
接着上一步,保存后,完全退出此程序,然后再次进入。
Perfect!
以上是关于Android中的文件存储的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )(代码片段