Пример учебника по внутреннему хранилищу Android

Сегодня мы рассмотрим внутреннее хранилище Android. Android предлагает несколько структурированных способов для хранения данных. Среди них:

В этом руководстве мы рассмотрим сохранение и чтение данных в файлы с использованием Внутреннего хранилища 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 по следующей ссылке.

Загрузить проект примера внутреннего хранилища Android

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