Тема 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();
}
}
}
}