今天,我们来看看Android的内部存储。Android提供了几种结构化的方式来存储数据 。这些措施包括
- 共享Preferences
- 内部存储
- 外部Storage
- SQLite Storage
- 通过网络连接实现存储(在云上)
在本教程中,我们将研究如何使用Android内部存储 将数据存入文件和读取数据。
Android内部存储
Android内部存储 是私有数据在设备内存上的存储。默认情况下,将文件保存和加载到内部存储是应用程序的私有内容,其他应用程序将无法访问这些文件。当用户卸载应用程序时,与该应用程序相关联的内部存储文件也会被删除。然而,请注意,一些用户** 根** 他们的Android手机,获得了超级用户访问权限。这些用户将能够读写他们想要的任何文件。
Android内存中文本文件的读写
Android提供了Java I/O类中的OpenFileInput
和OpenFileOutput
来修改本地文件的读写流。
- OpenFileOutput() :该方法用于创建和保存文件。其语法如下:
1FileOutputStream fout=OpenFileOutput();
2`方法`OpenFileOutput()`返回`FileOutputStream`的实例。之后,我们可以调用WRITE方法在文件上写入数据。其语法如下:`
3字符串str=`测试数据`;
4FOut.write(str.getBytes());
- OpenFileInput() :该方法用于打开并读取文件。它返回FileInputStream的一个实例。
1FileInputStream fin=OpenFileInput(文件);
2在此之后,我们调用Read方法从文件中一次读取一个字符,然后打印它。其语法如下:`
3Intc;
4字符串temp=``;
5While((c=fin.read())!=-1){
6Temp=temp+Character.toString((Char)c);
7}
8
9Fin.lose();
10在上面的代码中,字符串temp包含文件的所有数据。
11* 请注意,这些方法不接受文件路径(例如,Path/to/file.txt),它们只接受简单的文件名。
12
13# Android内部存储项目结构
14
15[](https://journaldev.nyc3.digitaloceanspaces.com/2015/10/project-structure2.png)
16
17# Android内存示例代码
18
19XML布局包含一个用于将数据写入文件的`EditText`,以及一个写入按钮和读取按钮。请注意,仅在XML文件中定义了`onClick`方法,如下所示:`active_main.xml`
20
21```
22<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
23 xmlns:tools="https://schemas.android.com/tools"
24 android:layout_width="match_parent"
25 android:layout_height="match_parent"
26 >
27
28 <TextView
29 android:id="@+id/textView1"
30 android:layout_width="wrap_content"
31 android:layout_height="wrap_content"
32 android:layout_alignParentLeft="true"
33 android:layout_alignParentRight="true"
34 android:padding="5dp"
35 android:text="Android Read and Write Text from/to a File"
36 android:textStyle="bold"
37 android:textSize="28sp" />
38
39 <EditText
40 android:id="@+id/editText1"
41 android:layout_width="wrap_content"
42 android:layout_height="wrap_content"
43 android:layout_alignParentLeft="true"
44 android:layout_alignParentRight="true"
45 android:layout_below="@+id/textView1"
46 android:layout_marginTop="22dp"
47 android:minLines="5"
48 android:layout_margin="5dp">
49
50 <requestFocus />
51 </EditText>
52
53 <Button
54 android:id="@+id/button1"
55 android:layout_width="wrap_content"
56 android:layout_height="wrap_content"
57 android:text="Write Text into File"
58 android:onClick="WriteBtn"
59 android:layout_alignTop="@+id/button2"
60 android:layout_alignRight="@+id/editText1"
61 android:layout_alignEnd="@+id/editText1" />
62
63 <Button
64 android:id="@+id/button2"
65 android:layout_width="wrap_content"
66 android:layout_height="wrap_content"
67 android:text="Read Text From file"
68 android:onClick="ReadBtn"
69 android:layout_centerVertical="true"
70 android:layout_alignLeft="@+id/editText1"
71 android:layout_alignStart="@+id/editText1" />
72
73</RelativeLayout>
74```
75
76如上所述,`MainActivity`包含文件读写的实现。
77
78```
79package com.journaldev.internalstorage;
80
81import android.os.Bundle;
82import android.app.Activity;
83import android.view.View;
84import android.widget.EditText;
85import android.widget.Toast;
86import java.io.FileInputStream;
87import java.io.FileOutputStream;
88import java.io.InputStreamReader;
89import java.io.OutputStreamWriter;
90
91public class MainActivity extends Activity {
92
93 EditText textmsg;
94 static final int READ_BLOCK_SIZE = 100;
95 @Override
96 protected void onCreate(Bundle savedInstanceState) {
97 super.onCreate(savedInstanceState);
98 setContentView(R.layout.activity_main);
99
100 textmsg=(EditText)findViewById(R.id.editText1);
101 }
102
103 // write text to file
104 public void WriteBtn(View v) {
105 // add-write text into file
106 try {
107 FileOutputStream fileout=openFileOutput("mytextfile.txt", MODE_PRIVATE);
108 OutputStreamWriter outputWriter=new OutputStreamWriter(fileout);
109 outputWriter.write(textmsg.getText().toString());
110 outputWriter.close();
111
112 //display file saved message
113 Toast.makeText(getBaseContext(), "File saved successfully!",
114 Toast.LENGTH_SHORT).show();
115
116 } catch (Exception e) {
117 e.printStackTrace();
118 }
119 }
120
121 // Read text from file
122 public void ReadBtn(View v) {
123 //reading text from file
124 try {
125 FileInputStream fileIn=openFileInput("mytextfile.txt");
126 InputStreamReader InputRead= new InputStreamReader(fileIn);
127
128 char[] inputBuffer= new char[READ_BLOCK_SIZE];
129 String s="";
130 int charRead;
131
132 while ((charRead=InputRead.read(inputBuffer))>0) {
133 // char to string conversion
134 String readstring=String.copyValueOf(inputBuffer,0,charRead);
135 s +=readstring;
136 }
137 InputRead.close();
138 textmsg.setText(s);
139
140 } catch (Exception e) {
141 e.printStackTrace();
142 }
143 }
144}
145```
146
147在这里,当数据成功写入内部存储器时显示祝酒词,并且从文件读取数据时数据显示在EditText本身中。下面显示的图像是该项目的输出。该图像描述了写入内部存储的文本,在单击Read时,它将在相同的EditText中显示回文本。[](https://cdn.jsdelivr.net/gh/andsky/tutorials-images/spaces/2015/10/android-internal-storage-example.gif)
148
149# 文件在哪里?
150
151要真正查看该文件,请从工具->Android->Android设备监视器打开Android设备监视器。文件位于Data->Data->{包名}->文件中,如下图所示:[](https://journaldev.nyc3.digitaloceanspaces.com/2015/10/screenshot-adm.png)在项目的包名中找到文件myextfile.txt,即**com.Journal aldev.intralstore** 如下图所示:[](https://journaldev.nyc3.digitaloceanspaces.com/2015/10/screenshot-adm2.png)从下面的链接下载**安卓内部存储示例** 的最终方案。
152
153[下载安卓内部存储示例Project](https://journaldev.nyc3.digitaloceanspaces.com/android/InternalStorage.zip)