top of page

Тема 7.7. Работа с файлами

7.7.1. Чтение и сохранение файлов

Работа с настройками уровня activity и приложения позволяет сохранить небольшие данные отдельных типов (string, int), но для работы с большими массивами данных, такими как графические файлы, файлы мультимедиа и т.д., нам придется обращаться к файловой системе.

Приложение Android сохраняет свои данные в каталоге /data/data/<название_пакета>/ и, как правило, относительно этого каталога будет идти работа.

Для работы с файлами абстрактный класс android.content.Context определяет ряд методов:

  • deleteFile(String name): удаляет определенный файл

  • fileList(): получает все файлы, которые содержатся в подкаталоге /files в каталоге приложения

  • getCacheDir(): получает ссылку на подкаталог cache в каталоге приложения

  • getDir(String dirName, int mode): получает ссылку на подкаталог в каталоге приложения, если такого подкаталога нет, то он создается

  • getExternalCacheDir(): получает ссылку на папку /cache внешней файловой системы устройства

  • getExternalFilesDir(): получает ссылку на каталог /files внешней файловой системы устройства

  • getFileStreamPath(String filename): возвращает абсолютный путь к файлу в файловой системе

  • openFileInput(String filename): открывает файл для чтения

  • openFileOutput (String name, int mode): открывает файл для записи

Все файлы, которые создаются и редактируются в приложении, как правило, хранятся в подкаталоге /files в каталоге приложения.

Для непосредственного чтения и записи файлов применяются также стандартные классы Java из пакета java.io

Итак, применим функционал чтения-записи файлов в приложении. Пусть у нас будет следующая примитивная разметка layout:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:weightSum="10"

    android:orientation="vertical">

    <EditText

        android:id="@+id/save_text"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:gravity="top|left"

        android:layout_weight="4"/>

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="center"

        android:onClick="saveText"

        android:text="Сохранить"/>

 

    <TextView

        android:layout_marginTop="80dp"

        android:id="@+id/open_text"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_weight="4"/>

    <Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_gravity="center"

        android:onClick="openText"

        android:text="Открыть"/>

 

</LinearLayout>

Поле EditText предназначено для ввода текста, а TextView - для вывода ранее сохраненного текста. Для сохранения и восстановления текста добавлены две кнопки.

Теперь в коде Activity пропишем обработчики кнопок с сохранением и чтением файла:

 

import android.support.v7.app.ActionBarActivity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

 

import android.widget.TextView;

import android.widget.EditText;

import android.view.View;

import android.widget.Toast;

 

import java.io.IOException;

import java.io.FileOutputStream;

import java.io.FileInputStream;

 

 

public class MainActivity extends ActionBarActivity {

     

    FileInputStream fin;

    FileOutputStream fos;

     

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

    }

    // сохранение файла

    public void saveText(View view){

 

        try {

            EditText textBox = (EditText) findViewById(R.id.save_text);

            String text = textBox.getText().toString();

 

            fos = openFileOutput("content.txt", MODE_PRIVATE);

            fos.write(text.getBytes());

            Toast.makeText(this, "Файл сохранен", Toast.LENGTH_SHORT).show();

        }

        catch(IOException ex) {

 

            Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();

        }

        finally{

            try{

                if(fos!=null)

                    fos.close();

            }

            catch(IOException ex){

 

                Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();

            }

        }

    }

    // открытие файла

    public void openText(View view){

 

        TextView textView = (TextView) findViewById(R.id.open_text);

        try {

            fin = openFileInput("external.txt ");

            byte[] bytes = new byte[fin.available()];

            fin.read(bytes);

            String text = new String (bytes);

            textView.setText(text);

        }

        catch(IOException ex) {

             Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();

        }

        finally{

 

            try{

                if(fin!=null)

                    fin.close();

            }

            catch(IOException ex){

                 Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();

            }

        }

    }

}

bottom of page