今天我们将探讨安卓内部存储。安卓提供了一些结构化的方式来存储数据。这些方式包括
- Shared Preferences
- 内部存储
- 外部存储
- SQLite 存储
- 通过网络连接进行存储(云端)
在本教程中,我们将学习如何使用安卓内部存储来保存和读取数据到文件中。
安卓内部存储
安卓内部存储是将私有数据存储在设备内存中的方法。默认情况下,保存和加载文件到内部存储是应用程序私有的,其他应用程序无法访问这些文件。当用户卸载应用程序时,与应用程序相关联的内部存储文件也将被移除。但是,请注意,一些用户可能对其安卓手机进行root,获取超级用户权限。这些用户将能够读取和写入他们想要的任何文件。
在Android内部存储中读写文本文件
Android提供了Java I/O类中的openFileInput
和openFileOutput
来修改从本地文件读取和写入流的能力。
-
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内部存储示例的最终项目。
Source:
https://www.digitalocean.com/community/tutorials/android-internal-storage-example-tutorial