安卓开发笔记-------文件存储与本地数据库SQLite(一)

一、文章整体知识结构图

在这里插入图片描述

二、文件存储

Android是基于java语言的,在java中提供了一套完整的输入输出流操作体系,与文件有关的有FileInputStream,FileOutputStream等,通过这些类可以很方便的访问磁盘的内容。同样Android也支持这种方式来访问手机上的文件。
Android手机中有两个存储位置:内置存储空间和外部SD卡,针对不同位置文件的存储有所不同。那么接下来我们就看看,Android中如何通过文件来存储数据。

1.手机内置存储空间文件的存取

  • 将数据存储到文件中
    Context类中提供了一个openFileOutput(String name,int mode)方法,可以用于将数据存储到指定的文件中。这个方法接受两个参数。
    第一个参数是文件是文件名,在文件创建的时候使用的就是这个名称 ,这里的文件名不可以指定路径,因为所有的文件都默认存储到/data/data/packagename/files/目录下的。
    第二个参数是文件的操作模式,主要有两种模式可选,MODE_PRIVATE和MODE_APPEND。其中MODE_PRIVATE是默认的操作的模式,代表该文件是私有数据,只能应用本身访问,在该模式下,写入的内容会覆盖源文件的内容。MODE_APPEND则表示如果该文件已经存在,就往文件里面追加内容,不存在就创建新文件。其实文件的操作模式本来应该有四种,但另外两种模式过于危险,容易产生安全漏洞,已经在Android4.2版本中被废弃。
    openFileOutput(String name,int mode)方法返回的是一个FileOutputStream对象,得到这个对象之后就可以使用java流的方式将数据写入到文件中了。下面看一个简单例子,展示了如何将一段文本内容保存到文件中。
public void save() {
    String data = "Data to save";
    FileOutputStream out = null;
    BufferedWriter writer = null;
    try {
        out = openFileOutput("data", Context.MODE_PRIVATE);
        writer = new BufferedWriter(new OutputStreamWriter(out));
        writer.write(data);
    }catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            if (writer != null) {
                writer.close();
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.从文件中读取数据

类似于将数据存储到文件中,Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。这个方法要比openFileOutput()简单一些,它只接受一个参数,即要读取的文件名,然后系统会自动到/data/data/package name/files/目录去加载这个文件,并返回一个FileInputStream对象,得到这个对象之后再通过Java流的方式就可以将数据读取出来。下面一起来看一个小例子。

public String load() {
    FileInputStream in = null;
    BufferedReader reader = null;
    StringBuilder content = new StringBuilder();
    try {
        in = openFileInput("data");
        reader = new BufferedReader(new InputStreamReader(in));
        String  line = "";
        while ((line = reader.readLine()) != null) {
            content.append(Line);
        }
    }catch (IOException e) {
        e.printStackTrace();
    }finally {
        if (reader != null) {
            try {
                reader.close();
            }catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return content.toString();
}

下面来做一个完整的例子。
在这里插入图片描述

MainActivity中的代码
package com.example.file;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;

public class MainActivity extends AppCompatActivity {
    private EditText readText, writeText;
    private String fileName = "context.txt";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        readText = findViewById(R.id.readText);
        writeText = findViewById(R.id.writeText);

    }
    public void write(View view){
        try {
            FileOutputStream fos = openFileOutput(fileName, Context.MODE_APPEND);
            fos.write(writeText.getText().toString().getBytes());
            writeText.setText("");
            fos.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    public void read(View view){
        try {
            FileInputStream fis = openFileInput(fileName);
            StringBuffer sBuffer=new StringBuffer("");
            byte[] buffer=new byte[256];
            int hasRead=0;
            while ((hasRead=fis.read(buffer))!=-1){
                sBuffer.append(new String(buffer,0,hasRead));
            }
            readText.setText(sBuffer.toString());
            fis.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}


activity_main中的代码
<?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"
    android:padding="10dp">
    <EditText
        android:id="@+id/writeText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minLines="2"
        android:hint="输入你想写的文本"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="写入"
        android:onClick="write"/>

    <EditText
        android:id="@+id/readText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:enabled="false"
        android:hint="显示读取的内容" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="读取"
        android:onClick="read"/>



</LinearLayout>
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哥哥的梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值