Сегодня мы рассмотрим внутреннее хранилище Android. Android предлагает несколько структурированных способов для хранения данных. Среди них:
- Общие настройки
- Внутреннее хранилище
- Внешнее хранилище
- Хранилище SQLite
- Хранилище через сетевое подключение (в облаке)
В этом руководстве мы рассмотрим сохранение и чтение данных в файлы с использованием Внутреннего хранилища Android.
Внутреннее хранилище Android
Внутреннее хранилище Android – это хранение частных данных в памяти устройства. По умолчанию сохранение и загрузка файлов во внутреннее хранилище являются приватными для приложения, и другие приложения не будут иметь доступ к этим файлам. При удалении приложений файлы, связанные с внутренним хранилищем, также удаляются. Однако стоит отметить, что некоторые пользователи рутят свои телефоны Android, получая суперпользовательский доступ. Эти пользователи смогут читать и записывать любые файлы по своему усмотрению.
Чтение и запись текстового файла во внутреннем хранилище Android
Android предоставляет методы openFileInput
и openFileOutput
из классов Java I/O для изменения потоков чтения и записи из и в локальные файлы.
-
openFileOutput(): Этот метод используется для создания и сохранения файла. Его синтаксис приведен ниже:
FileOutputStream fOut = openFileOutput("имя файла",Context.MODE_PRIVATE);
Метод
openFileOutput()
возвращает экземплярFileOutputStream
. После этого мы можем вызвать метод write для записи данных в файл. Его синтаксис приведен ниже: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();
}
}
}
Здесь всплывает всплывающее окно, когда данные успешно записываются во внутреннее хранилище, и данные отображаются в самом 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