Android 内部存储示例教程

今天我们将探讨安卓内部存储。安卓提供了一些结构化的方式来存储数据。这些方式包括

在本教程中,我们将学习如何使用安卓内部存储来保存和读取数据到文件中。

安卓内部存储

安卓内部存储是将私有数据存储在设备内存中的方法。默认情况下,保存和加载文件到内部存储是应用程序私有的,其他应用程序无法访问这些文件。当用户卸载应用程序时,与应用程序相关联的内部存储文件也将被移除。但是,请注意,一些用户可能对其安卓手机进行root,获取超级用户权限。这些用户将能够读取和写入他们想要的任何文件。

在Android内部存储中读写文本文件

Android提供了Java I/O类中的openFileInputopenFileOutput来修改从本地文件读取和写入流的能力。

  • openFileOutput():此方法用于创建和保存文件。其语法如下:

    FileOutputStream fOut = openFileOutput("文件名", Context.MODE_PRIVATE);
    

    方法openFileOutput()返回一个FileOutputStream的实例。然后,我们可以调用写入方法来向文件写入数据。其语法如下:

    String str = "测试数据";
    fOut.write(str.getBytes());
    fOut.close();
    
  • openFileInput():该方法用于打开文件并读取其内容。它返回一个FileInputStream实例。其语法如下:

    FileInputStream fin = openFileInput(file);
    

    然后,我们调用read方法逐个字符地从文件中读取,并打印出来。其语法如下:

    int c;
    String temp="";
    while( (c = fin.read()) != -1){
       temp = temp + Character.toString((char)c);
    }
    
    fin.close();
    

    在上面的代码中,字符串temp包含了文件的所有数据。

  • 请注意,这些方法不接受文件路径(例如path/to/file.txt),它们只接受简单的文件名。

Android内部存储项目结构

Android 内部存储示例代码

xml 布局包含一个 EditText 用于写入数据到文件,以及一个写入按钮和读取按钮。请注意,onClick 方法仅在 xml 文件中定义,如下所示:activity_main.xml

<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:padding="5dp"
        android:text="Android Read and Write Text from/to a File"
        android:textStyle="bold"
        android:textSize="28sp" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="22dp"
        android:minLines="5"
        android:layout_margin="5dp">

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Write Text into File"
        android:onClick="WriteBtn"
        android:layout_alignTop="@+id/button2"
        android:layout_alignRight="@+id/editText1"
        android:layout_alignEnd="@+id/editText1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Read Text From file"
        android:onClick="ReadBtn"
        android:layout_centerVertical="true"
        android:layout_alignLeft="@+id/editText1"
        android:layout_alignStart="@+id/editText1" />

</RelativeLayout>

MainActivity 包含对文件进行读写的实现,如上所述。

package com.journaldev.internalstorage;


import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class MainActivity extends Activity {

    EditText textmsg;
    static final int READ_BLOCK_SIZE = 100;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textmsg=(EditText)findViewById(R.id.editText1);
    }

    // 写入文本到文件
    public void WriteBtn(View v) {
        // 向文件中添加文本
        try {
            FileOutputStream fileout=openFileOutput("mytextfile.txt", MODE_PRIVATE);
            OutputStreamWriter outputWriter=new OutputStreamWriter(fileout);
            outputWriter.write(textmsg.getText().toString());
            outputWriter.close();

            // 显示文件保存消息
            Toast.makeText(getBaseContext(), "File saved successfully!",
                    Toast.LENGTH_SHORT).show();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 从文件读取文本
    public void ReadBtn(View v) {
        // 从文件读取文本
        try {
            FileInputStream fileIn=openFileInput("mytextfile.txt");
            InputStreamReader InputRead= new InputStreamReader(fileIn);

            char[] inputBuffer= new char[READ_BLOCK_SIZE];
            String s="";
            int charRead;

            while ((charRead=InputRead.read(inputBuffer))>0) {
                // 字符到字符串转换
                String readstring=String.copyValueOf(inputBuffer,0,charRead);
                s +=readstring;
            }
            InputRead.close();
            textmsg.setText(s);
            

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里,当数据成功写入内部存储时,会显示一个 toast,而当从文件读取数据时,数据会显示在 EditText 中。下面显示的图像是该项目的输出。该图像展示了文本被写入内部存储,点击“读取”后,文本会显示在相同的 EditText 中。

文件位于哪里?

要查看文件,请从“工具”->“Android”->“Android设备监视器”中打开Android设备监视器。 如下图所示,文件位于data->data->{package name}->files文件夹中: 文件“mytextfile.txt”位于项目的包名中,即com.journaldev.internalstorage,如下图所示: 从下面的链接下载Android内部存储示例的最终项目。

下载Android内部存储示例项目

Source:
https://www.digitalocean.com/community/tutorials/android-internal-storage-example-tutorial