Работа с файлами android

Содержание

Урок 75. Хранение данных. Работа с файлами

Работа с файлами android

В этом уроке:

– работаем с файлами

Работа с файлами в Android не сильно отличается от таковой в Java. В этом уроке рассмотрим, как записать/прочесть файл во внутреннюю память и на SD-карту.

Создадим проект:

Project name: P0751_Files
Build Target: Android 2.3.3
Application name: Files
Package name: ru.startandroid.develop.p0751files
Create Activity: MainActivity

Заполним strings.xml:

P0751_Files Записать файл Прочесть файл Записать файл на SD Прочесть файл с SD

Рисуем экран main.xml:

4 кнопки, смысл которых понятен по тексту на них.

MainActivity.java:

package ru.startandroid.develop.p0751files; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.view.View; public class MainActivity extends Activity { final String LOG_TAG = “myLogs”; final String FILENAME = “file”; final String DIR_SD = “MyFiles”; final String FILENAME_SD = “fileSD”; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void onclick(View v) { switch (v.getId()) { case R.id.btnWrite: writeFile(); break; case R.id.btnRead: readFile(); break; case R.id.btnWriteSD: writeFileSD(); break; case R.id.btnReadSD: readFileSD(); break; } } void writeFile() { try { // отрываем поток для записи BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( openFileOutput(FILENAME, MODE_PRIVATE))); // пишем данные bw.write(“Содержимое файла”); // закрываем поток bw.close(); Log.d(LOG_TAG, “Файл записан”); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } void readFile() { try { // открываем поток для чтения BufferedReader br = new BufferedReader(new InputStreamReader( openFileInput(FILENAME))); String str = “”; // читаем содержимое while ((str = br.readLine()) != null) { Log.d(LOG_TAG, str); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } void writeFileSD() { // проверяем доступность SD if (!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { Log.d(LOG_TAG, “SD-карта не доступна: ” + Environment.getExternalStorageState()); return; } // получаем путь к SD File sdPath = Environment.getExternalStorageDirectory(); // добавляем свой каталог к пути sdPath = new File(sdPath.getAbsolutePath() + “/” + DIR_SD); // создаем каталог sdPath.mkdirs(); // формируем объект File, который содержит путь к файлу File sdFile = new File(sdPath, FILENAME_SD); try { // открываем поток для записи BufferedWriter bw = new BufferedWriter(new FileWriter(sdFile)); // пишем данные bw.write(“Содержимое файла на SD”); // закрываем поток bw.close(); Log.d(LOG_TAG, “Файл записан на SD: ” + sdFile.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } } void readFileSD() { // проверяем доступность SD if (!Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { Log.d(LOG_TAG, “SD-карта не доступна: ” + Environment.getExternalStorageState()); return; } // получаем путь к SD File sdPath = Environment.getExternalStorageDirectory(); // добавляем свой каталог к пути sdPath = new File(sdPath.getAbsolutePath() + “/” + DIR_SD); // формируем объект File, который содержит путь к файлу File sdFile = new File(sdPath, FILENAME_SD); try { // открываем поток для чтения BufferedReader br = new BufferedReader(new FileReader(sdFile)); String str = “”; // читаем содержимое while ((str = br.readLine()) != null) { Log.d(LOG_TAG, str); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

В onclick обрабатываем нажатия 4-х кнопок и вызываем соответствующие методы.

writeFile – запись файла во внутреннюю память. Используется метод openFileOutput, который на вход берет имя файла и режим записи: MODE_PRIVATE – файл доступен только этому приложению, MODE_WORLD_READABLE – файл доступен для чтения всем, MODE_WORLD_WRITEABLE – файл доступен для записи всем, MODE_APPEND – файл будет дописан, а не начат заново.

readFile – чтение файла из внутренней памяти. Используем метод openFileInput, принимающий на вход имя файла. Здесь и в методе записи внутреннего файла вы можете задать только имя файла, а каталог для ваших файлов вам уже выделен.

writeFileSD – запись файла на SD. Используем метод getExternalStorageState для получения состояния SD-карты. Здесь можно посмотреть какие бывают состояния. Нам нужно MEDIA_MOUNTED – когда SD-карта вставлена и готова к работе. Далее мы получаем путь к SD-карте (метод getExternalStorageDirectory), добавляем свой каталог и имя файла, создаем каталог и пишем данные в файл.

readFileSD – чтение файла с SD. Все аналогично предыдущему методу, только файл не пишем, а читаем.

Осталось в манифест добавить разрешение на работу с файлами на SD – android.permission.WRITE_EXTERNAL_STORAGE.

Все сохраним и запустим. Видим экран с 4-мя кнопками:

Внутренняя память

Жмем кнопку Записать файл.  Видим в логе:

Файл записан

Проверим. Идем в File Explorer (Window > Show View > Other > Android > File Explorer) и открываем там папку data/data/ru.startandroid.develop.p0751files/files и видим там наш файл file.

Возвращаемся в эмулятор. Жмем Прочесть файл и в логе видим:

Содержимое файла

Это тот текст, который мы записывали в файл.

SD карта

Теперь жмем Записать файл на SD.

В логе видим:

Файл записан на SD: /mnt/sdcard/MyFiles/fileSD

Проверяем. Идем в FileExplorer и открываем там папку mnt/sdcard/MyFiles/ а в ней файл fileSD.

Возвращаемся в эмулятор и жмем кнопку Прочесть файл с SD. В логе видим:

Содержимое файла на SD

Этот текст мы и записывали.

mnt/sdcard – обычно этот путь ведет к содержимому SD-карты. Возможно у вас он будет другой.

В общем, при работе с файлами на SD вы используете стандартные java механизмы. А при работе с внутренним хранилищем для удобства можно использовать методы-оболочки от Activity:

openFileOutput – открыть файл на запись

openFileInput – открыть файл на чтение

deleteFile – удалить файл

И есть метод getFilesDir – возвращает объект File, соответствующий каталогу для файлов вашей программы. Используйте его, чтобы работать напрямую, без методов-оболочек.

Подробности работы в java с файловой системой я здесь описывать не буду. На нашем форуме пользователь SKR сделал отличную памятку по работе с файлами. Скорее всего, вы найдете там все что нужно.

Если у вас проверка SD-карты показывает, что карта недоступна (см. лог), то убедитесь в свойствах AVD, что у вас для SDCard указан Size или File. Если указаны, то попробуйте перезапустить AVD.

На следующем уроке:

– создаем экран с вкладками – используем иконку в названии вкладки

– используем обработчик перехода между вкладками

Источник: https://startandroid.ru/ru/uroki/vse-uroki-spiskom/138-urok-75-hranenie-dannyh-rabota-s-fajlami.html

Топ-7 бесплатных файл-менеджеров для Android

Работа с файлами android

Одна из лучших особенностей Android — это возможность быстро и легко перемещаться по файловой системе вашего устройства.

Но какое приложение для этого использовать? «Файлы» от Google входят в состав чистого Android, многие производители добавляют собственные программы для работы с файлами.

Помимо этого, существует множество вариантов от сторонних разработчиков. Давайте рассмотрим семь самых интересных вариантов.

Total Commander

Total Commander, без сомнения, будет знаком многим пользователям настольных компьютеров — приложение было популярным сторонним менеджером файлов для Windows с момента первоначального запускав в 1993 году (ранее он назывался Windows Commander).

Приложение оснащается очень хорошим набором инструментов навигации, помимо обычных вырезать, копировать и вставить. Например, имеется поддержка закладок и упаковки файлов. Помимо этого, имеется возможность добавлять настраиваемые кнопки на панель инструментов. Не забудьте подписаться на канал нашего техноблога в Telegram — https://t.me/appdatemedia.

Возможности Total Commander позволяют копировать и перемещать целых подкаталогов и включают текстовый редактор, способ передачи файлов по Bluetooth, поддержку ZIP-файлов и плагинов для клиентов FTP / SFTP, WebDAV и доступ по локальной сети.

Google Files

С недавних пор это родной файл-менеджера чистого Android. Он оснащен тремя основными функциями: просмотр файлов, очистка от ненужных и старых файлов, а также возможность обмениваться зашифрованными файлами и папками с друзьями и близкими без подключения к интернету.

Раздел приложения для управления файлами не так «богат», как другие, например, вы не можете перемещаться по корневых каталогам.

Вместо продвинутых функций, программа разрабатывалась с учетом простоты использования для обычных пользователей. Ваш контент будет разделен на шесть категорий («Загрузки», «Изображения», «», «», «Документы», «Приложения»).

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

X-plore

X-plore File Manager может выглядеть как программа Windows начала 1990-х годов, но он является одним из лучших бесплатных файл-менеджеров. Разработчики при его создании поставили на первое место функциональность, а не дизайн. Его основной особенностью является двухпанельный интерфейс. Таким образом вы можете с легкостью перемещать файлы по каталогам.

Приложение поддерживает Google Drive, Dropbox, Box, Amazon Cloud Drive, OneDrive, WebDAV, MediaFire и многие другие. Помимо этого вы сможете воспользоваться протоколами FTP, SMB, SQLite, ZIP, RAR, 7-Zip и DLNA / UPnP.

X-plore позволит вам просматривать системные файлы без рутирования устройства, но отредактировать их в таком случае не получится. Также имеется встроенные аудио и видео проигрыватель.

FX File Explorer

FX File Explorer — отличный выбор для пользователей, которые ценят конфиденциальность. Он абсолютно бесплатен и без рекламы, отслеживания и сбора данных. Приложения запрашивает некоторые разрешения после установки, но они не являются обязательными и предусмотрены для работы некоторых дополнительных функций.

Приложение поддерживает «из коробки» работу с внешними носителями и возможности root, но вам придется доплатить за расширенные сетевые функции такие как FTP, SFTP, SMB, WebDAV и поддержку облачных сервисов, среди которых Dropbox, Google Drive, SkyDrive, Box и SugarSync.

FX File Explorer также оснащен мощными возможностями обмена файлами. Вы сможете делиться ими по Wi-Fi, причем необходимость в точке доступа отсутствует, поскольку приложение поддерживает Wi-Fi Direct.

Solid Explorer

Да, мы помним, что это топ бесплатных приложений. Тем не менее Solid Explorer — один из немногих файл-менеджеров, который действительно стоит своих денег. Он использует тот же двухпанельный интерфейс, что и в -plore. Однако, в отличие от него, он может похвастаться отличным дизайном, который отвечает всем стандартам Google Material Design.

Вы можете перетаскивать панели между собой, тем самым упрощая организацию управления файлами. Поддерживаются внешние хранилища, а также различные протоколы и форматы, такие как FTP, SFTP, WebDav, ZIP, TAR и RAR.

Приложение также позволяет подключать облачные хранилища Google Drive, OneDrive, Box, Dropbox и многое другое.

Помимо этого, Solid Explorer предлагает расширять функциональность с помощью плагинов, индексированный поиск и статистику накопителей.

Astro

Файловый менеджер Astro вышел за рамки своей первоначальной цели. Сегодня это больше, чем файловый менеджер — приложение также включает в себя очистку хранилища и инструмент резервного копирования.

Интерфейс приложения интуитивно понятен. Быстрая и простая пошаговая навигация между внутренней памятью, внешним накопителем и другим контентом. Возможности приложения включают синхронизацию Box, Dropbox, OneDrive и Google Drive и простое управление кэшем. Помимо управления файлами, особенно полезны функции управления процессами и картой памяти microSD.

Amaze File Manager

Amaze File Manager — единственный в нашем списке файловый менеджер Android с открытым исходным кодом. Он использует подход с вкладками, позволяя вам работать с несколькими папками одновременно.

Другие полезные функции включают диспетчер приложений, обозреватель корневых каталогов, шифрование файлов AES, историю, закладки и мощный инструмент поиска. Помимо этого, «из коробки» вам будут доступны возможность просмотра ZIP-файлов, APK-ридер и просмотрщик текстовых файлов.

Послесловие

Теперь у вас есть довольно большой выбор инструментов для управления файлами на вашем Android-устройстве. Приложения для просмотра файлов — это всего лишь один из многих инструментов для повышения производительности, которые вам понадобятся.

Наш канал в Telegram

Источник: https://zen.yandex.ru/media/thexframe/top7-besplatnyh-failmenedjerov-dlia-android-5f16fa8e74965564410e3e13

Работа с файловой системой

Работа с файлами android

Последнее обновление: 25.12.2020

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

ОС Android построена на основе Linux. Этот факт находит свое отражение в работе с файлами. Так, в путях к файлам в качестве разграничителя в Linux использует слеш “/”, а не обратный слеш “\” (как в Windows). А все названия файлов и каталогов являются регистрозависимыми, то есть “data” это не то же самое, что и “Data”.

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

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

  • boolean deleteFile (String name): удаляет определенный файл
  • String[] fileList (): получает все файлы, которые содержатся в подкаталоге /files в каталоге приложения
  • File getCacheDir(): получает ссылку на подкаталог cache в каталоге приложения
  • File getDir(String dirName, int mode): получает ссылку на подкаталог в каталоге приложения, если такого подкаталога нет, то он создается
  • File getExternalCacheDir(): получает ссылку на папку /cache внешней файловой системы устройства
  • File getExternalFilesDir(String type): получает ссылку на каталог /files внешней файловой системы устройства
  • File getFileStreamPath(String filename): возвращает абсолютный путь к файлу в файловой системе
  • FileInputStream openFileInput(String filename): открывает файл для чтения
  • FileOutputStream openFileOutput (String name, int mode): открывает файл для записи

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

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

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

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

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

package com.example.filesapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity { private final static String FILE_NAME = “content.txt”; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } // сохранение файла public void saveText(View view){ FileOutputStream fos = null; try { EditText textBox = (EditText) findViewById(R.id.editor); String text = textBox.getText().toString(); fos = openFileOutput(FILE_NAME, 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){ FileInputStream fin = null; TextView textView = (TextView) findViewById(R.id.text); try { fin = openFileInput(FILE_NAME); 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(); } } } }

При нажатии на кнопку сохранения будет создаваться поток вывода FileOutputStream fos = openFileOutput(FILE_NAME, MODE_PRIVATE)

В данном случае введенный текст будет сохраняться в файл “content.txt”. При этом будет использоваться режим MODE_PRIVATE

Система позволяет создавать файлы с двумя разными режимами:

  • MODE_PRIVATE: файлы могут быть доступны только владельцу приложения (режим по умолчанию)
  • MODE_APPEND: данные могут быть добавлены в конец файла

Поэтому в данном случае если файл “content.txt” уже существует, то он будет перезаписан. Если же нам надо было дописать файл, тогда надо было бы использовать режим MODE_APPEND:

FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);

Для чтения файла применяется поток ввода FileInputStream:

FileInputStream fin = openFileInput(FILE_NAME);

Подробнее про использование потоков ввода-вывода можно прочитать в руководстве по Java: https://metanit.com/java/tutorial/6.3.php

В итоге после нажатия кнопки сохранения весь текст будет сохранен в файле /data/data/название_пакета/files/content.txt

Где физически находится созданный файл? Чтобы увидеть его на подключенном устройстве перейдем в Android Stud в меню к пункту View -> Tool Windows -> Device File Explorer

После этого откроектся окно Device File Explorer для просмотра файловой системы устройства. И в папке data/data/[название_пакета_приложения]/files мы сможем найти сохраненный файл.

Источник: https://metanit.com/java/android/13.1.php

Файл в ОС Android. Операции чтения и записи

Работа с файлами android

Операции чтения и записи в файл являются стандартным функционалом любых приложений, которые ведут журналирование событий, работу с файлами, вплоть до передачи данных по сети. В данной статье рассмотрим методы записи в файлы информации и чтения из файла записанной строки.

Структура проекта

Эстетических изменений стандартных кнопок или ListView в данном уроке производиться не будет, поскольку мы будем работать с тем, что скрыто от глаз пользователя, а именно работать с файлами.

Вся структура проекта соответственно состоит на этот раз лишь из одного класса: MainActivity

Также в проекте присутствуют следующие файлы ресурсов:

  1. activity_main.xml
  2. strings.xml
  3. styles.xml – в данном файле отсутствуют какие-либо изменения относящиеся к проекту.

Кроме этого внесены изменения в файл AndroidManifest.xml. В файле необходимо добавить следующие две строки.

Это разрешения для приложения – производить операции чтения и записи с внешним накопителем (то есть SD Card телефона) В современным смартфонах на базе ОС Android в большинстве случаев запись информации производится во внешний накопитель, хотя обычный пользователь считает этот накопитель внутренним, поскольку он является встроенным, но с точки зрения операционной систем данный накопитель (то есть SD Card) является внешним накопителем. В данной статье не будет рассматриваться вариант работы с истинно внутренним накопителем.

activity_main.xml

Разметка основной активити, в которой будет производиться работа нашего приложения. В данной разметке присутствует всего две кнопки (Button) и текстовое поле (TextView), в которое мы будем выводить информацию сохранённую в файле.

strings.xml

Файл ресурсов текста в ОС Android. Подготовка всех строк, которые применяются в Вашем Приложении в данном файле, является не только хорошим тоном, но обязательным условием для разработки качественного Приложения.

Поскольку, если вы будете дисциплинировать себя, сохранять всю подобную информацию в данном файле, то впоследствии это окупится, когда вы будете производить перевод Приложения на другие языки.

Тем более, что в Android Studio имеется удобный функционал для этого.

Work With Files Hello world! Settings Запись выполнена Записать данные в файл Считать данные из файла

styles.xml

В данном файле нет изменений относящихся к проекту. Но при создании проекта стандартная тема оформления не рендерится Android Studio. Выдается ошибки при предпросмотре и в режиме дизайна. Чтобы этого избежать, пропишите следующую информацию взамен старой.

Основной класс проекта – MainActivity.java

Сегодня в данном классе сконцентрирован весь программный код. В данном классе производится формирование внешнего вида главной активити, а также организуется работа с файлами.

package ru.evileg.workwithfiles; import android.os.Bundle; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; public class MainActivity extends AppCompatActivity implements View.OnClickListener { /* * Создаем постоянные константы для удобства работы, * объявляем TextView, который должен быть доступен в нескольких методах класса */ private static final String fileName = “hello.txt”; private static final String text = “Hello World”; private static TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /* * Объявляем и инциализируем Кнопки (Button), * а также инициализируем TextView * Также в активити имплементирован метод слушателя событий нажатия, * то есть OnClickListener, который привязывается к кнопкам */ textView = (TextView) this.findViewById(R.id.textView); Button buttonWrite = (Button) this.findViewById(R.id.buttonWrite); Button buttonRead = (Button) this.findViewById(R.id.buttonRead); buttonWrite.setOnClickListener(this); buttonRead.setOnClickListener(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } /* * Обработчик нажатий кнопок. Нажатая кнопка определяется по её ID через метод getID() */ @Override public void onClick(View v) { switch (v.getId()){ case R.id.buttonWrite: writeFile(); break; case R.id.buttonRead: readFile(); break; default: break; } } private void writeFile() { try { /* * Создается объект файла, при этом путь к файлу находиться методом класcа Environment * Обращение идёт, как и было сказано выше к внешнему накопителю */ File myFile = new File(Environment.getExternalStorageDirectory().toString() + “/” + fileName); myFile.createNewFile(); // Создается файл, если он не был создан FileOutputStream outputStream = new FileOutputStream(myFile); // После чего создаем поток для записи outputStream.write(text.getBytes()); // и производим непосредственно запись outputStream.close(); /* * Вызов сообщения Toast не относится к теме. * Просто для удобства визуального контроля исполнения метода в приложении */ Toast.makeText(this, R.string.write_done, Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } } private void readFile() { /* * Аналогично создается объект файла */ File myFile = new File(Environment.getExternalStorageDirectory().toString() + “/” + fileName); try { FileInputStream inputStream = new FileInputStream(myFile); /* * Буфферезируем данные из выходного потока файла */ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); /* * Класс для создания строк из последовательностей символов */ StringBuilder stringBuilder = new StringBuilder(); String line; try { /* * Производим построчное считывание данных из файла в конструктор строки, * Псоле того, как данные закончились, производим вывод текста в TextView */ while ((line = bufferedReader.readLine()) != null){ stringBuilder.append(line); } textView.setText(stringBuilder); } catch (IOException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); } } }

Итог

Если в процессе изучения материала не возникло никаких проблем и ошибок, то по нажатию кнопки записи в файл произойдет создание нового файла и будет произведена запись строки “Hello World”. При нажатии кнопки чтения будет выведена информация сохранённая в текстовом файле. Процесс показан на скриншотах ниже.

По нажатию кнопки производится запись в файл информации

Запись в файл

Чтение из файла производится по нажатию соответствующей кнопки. При этом в TextView выводится текст

Созданный файл hello.txt в файловом менеджере

Источник: https://evileg.com/ru/post/230/

Создаём текстовый редактор

Работа с файлами android

Операции с файлами
Сохранение настроек – Флажки
Сохранение текстовых настроек
Сохранение настроек – Списки

Операции с файлами

Рассмотрим вопросы ввода/вывода, которые являются распространёнными операциями в программировании. В Android можно сохранять файлы непосредственно на самом устройстве или на внешней карте памяти.

Для каждой программы на устройстве выделяется собственная папка, в которой приложение может хранить свои файлы. По умолчанию другие приложения не могут обращаться к этим файлам.

Если вы сохраняете файлы на внешнем накопителе, то доступ возможен.

Android использует стандартные операции ввода/вывода, принятые в Java. Например, Android реализует файловые потоки с помощью классов из пакета java.io, а также имеет собственные классы для работы с файлами внутри приложения.

Чтобы записать данные в файл, необходимо вызвать метод Context.openFileOutput() и передать в качестве параметра имя файла. Метод возвращает стандартный Java-объект FileOutputStream. Вызов метода для данного файла из другого приложения не будет работать, обратиться вы можете только к своим файлам. Например, чтобы создать файл и записать данные, пишем следующий код:
String FILENAME = “hello_file”;String mystring = “hello world!”; FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);fos.write(mystring.getBytes());fos.close();

Если имеется статический файл, который надо упаковать с вашим приложением во время компиляции проекта, можно сохранить его в каталоге res/raw/, а затем открыть его при помощи метода Resources.openRawResource(). Он возвращает объект InputStream, который можно использовать для чтения файла. После окончания работы с потоком не забудьте его закрыть, вызвав метод close().

Создадим простейший аналог Блокнота, позволяющий записывать и читать данные из файла.

На экране активности разместим компонент EditText и растянем его:

activity_main.xml

Создадим пункты меню Открыть и Сохранить в ресурсах:

res/menu/menu_main.xml

Обратите внимание, что для пунктов меню я использовал системные значки @android:drawable/ic_menu_save и @android:drawable/ic_menu_day, зашитые в систему. На самом деле Google не рекомендует использовать подобный подход. Лучшим решением будет скопировать нужный значок из папки SDK и разместить его в папке ресурсов.

В методах openFile() и saveFile() реализуем операции по открытию и сохранению файла.

MainActivity.java

package ru.alexanderklimov.testapplication; import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.Menu;import android.view.MenuItem;import android.widget.EditText;import android.widget.Toast; import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.

OutputStreamWriter; public class MainActivity extends ActionBarActivity { private final static String FILENAME = “sample.txt”; // имя файла private EditText mEditText; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEditText = (EditText) findViewById(R.id.

editText); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_open: openFile(FILENAME); return true; case R.id.

action_save: saveFile(FILENAME); return true; default: return true; } } // Метод для открытия файла private void openFile(String fileName) { try { InputStream inputStream = openFileInput(fileName); if (inputStream != null) { InputStreamReader isr = new InputStreamReader(inputStream); BufferedReader reader = new BufferedReader(isr); String line; StringBuilder builder = new StringBuilder(); while ((line = reader.readLine()) != null) { builder.append(line + “”); } inputStream.close(); mEditText.setText(builder.toString()); } } catch (Throwable t) { Toast.makeText(getApplicationContext(), “Exception: ” + t.toString(), Toast.LENGTH_LONG).show(); } } // Метод для сохранения файла private void saveFile(String fileName) { try { OutputStream outputStream = openFileOutput(fileName, 0); OutputStreamWriter osw = new OutputStreamWriter(outputStream); osw.write(mEditText.getText().toString()); osw.close(); } catch (Throwable t) { Toast.makeText(getApplicationContext(), “Exception: ” + t.toString(), Toast.LENGTH_LONG).show(); } }}

Мы получили простой блокнотик, позволяющий сохранять записи в одном заданном файле. Вы можете усовершенствовать приложение, добавив возможность создания новых файлов и их удаления.

Сохранение настроек – Флажки

Расширим функциональность блокнота, добавив в него возможность сохранения различных настроек.

Подготовим различные настройки, которые будем хранить в файле строковых ресурсов strings.xml:

res/values/strings.xml

Notepad Открыть Сохранить Настройки Режим открытия Цвет Черный цвет Красный цвет Зеленый цвет Синий цвет Размер Стиль Нормальный Полужирный Курсив

Теперь создадим файл настроек preferences.xml (если забыли, то перечитайте статью Сохранение настроек):

res/xml/preferences.xml

Итак, мы определили первую настройку под именем pref_openmode, которая будет или сразу загружать файл в поле редактирования, если установлен флажок, или открывать пустое поле, если флажок не установлен.

Создадим новую активность, которая наследует от класса PreferenceActivity. В классе активности для предпочтений внутри метода обратного вызова onCreate() нужно только вызвать метод addPreferencesFromResource() и загрузить XML-файл preferences.xml, содержащий наши настройки (пока одну):

SettingsActivity.java

package ru.alexanderklimov.notepad; import android.os.Bundle;import android.preference.

PreferenceActivity; public class SettingsActivity extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.

onCreate(savedInstanceState); // загружаем предпочтения из ресурсов addPreferencesFromResource(R.xml.preferences); }}

Не забываем добавить объявление активности SettingsActivity в файл манифеста AndroidManifest.xml:

Сейчас метод addPreferencesFromResource() считается устаревшим и для Android 4.0 и выше следует использовать другой код. Но ничего страшного.

Добавим новый пункт меню Настройки в меню (файл res/menu/main.xml), чтобы открывать подготовленное окно настроек.

В методе обратного вызова onOptionsItemSelected() добавим новый блок case для оператора switch:

case R.id.action_settings: Intent intent = new Intent(); intent.setClass(this, SettingsActivity.class); startActivity(intent); return true;

Запустите приложение и убедитесь, что в меню появился новый пункт, который открывает окно настроек.

Чтение установок предпочтений нужно проводить в методе onResume(), который вызывается системой как во время запуска приложения, так и после закрытия окна настроек и возврата главной активности на передний план:

@Overridepublic void onResume() { super.onResume(); SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(this); // читаем установленное значение из CheckBoxPreference if (prefs.getBoolean(getString(R.string.pref_openmode), false)) { openFile(FILENAME); }} В методе getBoolean() второй параметр false означает значение по умолчанию для возвращаемого значения предпочтения, если запрос на чтение установленного значения закончится неудачей.

Мы создали первую настройку, позволяющую сразу открывать нужный файл для редактирования, если отметить галочкой нужный пункт.

Сохранение текстовых настроек

Добавим возможность устанавливать размер шрифта для текста. Откроем снова файл preferences.xml и добавим новый элемент EditTextPreference:

В метод onResume() добавим новый код для чтения установленного значения размера шрифта:

// читаем размер шрифта из EditTextPreferencefloat fSize = Float.parseFloat(prefs.getString( getString(R.string.pref_size), “20”));// применяем настройки в текстовом полеmEditText.setTextSize(fSize);

Запустите проект и вызовите окно настроек. Теперь у нас появилась опция установки размера шрифта. Если щёлкнуть на новом пункте, то откроется диалоговое окно с текстовым полем ввода.

Обращаю ваше внимание, что в нашем примере не проверяется пользовательский ввод, что может привести к ошибкам, если вместо числового значения для размера шрифта пользователь введет слово Кот или любое другое слово из трёх букв. Никогда не доверяйте пользователю!

Сохранение настроек – Списки

Продолжим работу с текстовым редактором и добавим в него список для выбора стиля текста. В списке будет четыре опции: Обычный, Полужирный, Курсив, Полужирный+Курсив.

Подготовим массив строк и сохраним его в файле arrays.xml, который необходимо поместить в каталог res/values/.

res/values/arrays.xml

Обычный Полужирный Курсив Полужирный+Курсив

В файл preferences.xml добавим дополнительный элемент , в котором определим атрибуты заголовка окна, привязку к массиву значений и значение по умолчанию:

Для чтения настроек из списка добавляем код в метод onResume():

// читаем стили текста из ListPreference String regular = prefs.getString(getString(R.string.pref_style), “”);int typeface = Typeface.NORMAL; if (regular.contains(“Полужирный”)) typeface += Typeface.BOLD; if (regular.contains(“Курсив”)) typeface += Typeface.ITALIC; // меняем настройки в EditText mEditText.setTypeface(null, typeface);

Запустив проект, вы теперь увидите новую настройку Стиль для шрифта, которая открывает диалоговое окно для выбора стиля из списка. Обратите внимание, что в диалоговом окне нет кнопки сохранения, только Отмена. Изменения сохраняются сразу при выборе опции списка.

В статье Сохранение настроек можно прочитать дополнительные материалы по улучшению окна настроек. Например, можно добавить новую настройку, связанную с выбором цвета для текста.

Дополнительное чтение

Обсуждение урока на форуме

Реклама

Источник: http://developer.alexanderklimov.ru/android/texteditor.php

Файловые операции в Android: чтение/запить во внутреннюю/внешнюю память

Работа с файлами android

В этой статье я опишу работу с файлами на Android, попутно вашему вниманию будет представлено несколько полезных методов для работы с потоками. После прочтения этой статьи вы узнаете как:

  • Работать с файлами во внутрней памяти
  • Работать с файлами на SD-карте
  • Превращать InputStream в String
  • Копировать содержимое InputStream в OutputStream

Набор утилитарных методов для работы с потоками

Все мы хотим писать меньше кода. А чтобы писать меньше, нужно повтороно его использовать и речь идет не о копи-пастинге Ниже будет представлен листинг класса, которые оболегчит нашу работы:

public class CommonIO { public final static String LINE_SEPARTOR = System.getProperty(“line.separator”); private static final int BUFFER_SIZE = 2048; private static final int EOF_MARK = -1; private CommonIO() { }; public static boolean close(Closeable closeable) { if (closeable != null) { try { closeable.close(); return true; } catch (IOException e) { e.printStackTrace(); return false; } } else { return false; } } public static String convertStreamToString(InputStream is) { try { return new java.util.Scanner(is).useDelimiter(“\A”).next(); } catch (java.util.NoSuchElementException e) { return “”; } } public static int writeFromInputToOutput(InputStream source, OutputStream dest) { byte[] buffer = new byte[BUFFER_SIZE]; int bytesRead = EOF_MARK; int count = 0; try { while ((bytesRead = source.read(buffer)) != EOF_MARK) { dest.write(buffer, 0, bytesRead); count += bytesRead; } } catch (IOException e) { e.printStackTrace(); } return count; } public static boolean isExternalAvailable() { return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); } }

Кратко опишу назначение этих методов:

close(Closeable)

convertStreamToString(InputStream)

writeFromInputToOutput(source, dest)

isExternalAvailable()

Закрывает любой объект, поддерживающий интерфейс Closeable, в том числе: потоки, курсоры, каналы, cокеты и многие другие. Спокойно примет null в качестве параметра.
Выполнит преобразование InputStream к строке. Является одной из реализаций трюков со Scanner. Использует дефолтную кодировку системы (понимаете к чему я клоню?).
Инкапсулирует рутинную работы по копированию данных из InputStream в OutputStream.
Проверяет доступность внешней памяти — SD-карты.

Далее по тексу вы увидите, сколько строк кода нам это сэкономит и от скольких потенциальных ошибок убережет.

Работа с файлами во внутренней памяти

Начнем с вопроса: где будет лежать записанный во внутреннюю память файл?

Ответ: локация файла опрделяется приложением его создавшим, и описывается так:

/data/data//

К сожалению (или к счастью?), выдирать файлы из памяти девайса стандартными методами нельзя, но можно с эмулятора, приведу иллюстрацию к вышеописанной схеме расположения файлов.

Иерархия распложения файлов во внутрнней памяти. Пакет приложения ‘by.idev.tools’, имя файла ‘menudomenu’. Изображение получено при помощи DDMS File Explorer

Перейдем непосредственно к реализации чтения/записи во внутренюю память:

public class FileUtils { public static File EXTERNAL_DIR = Environment.getExternalStorageDirectory(); private FileUtils() { }; public static boolean writeInternal(Context context, InputStream source, String fileName, int mode) { BufferedOutputStream dest = null; try { dest = new BufferedOutputStream(context.openFileOutput(fileName, mode)); CommonIO.writeFromInputToOutput(source, dest); return true; } catch (FileNotFoundException e) { e.printStackTrace(); return false; } finally { CommonIO.close(dest); } } public static InputStream readFromInternalile(Context context, String fileName) { BufferedInputStream source = null; try { source = new BufferedInputStream(context.openFileInput(fileName)); } catch (FileNotFoundException e) { e.printStackTrace(); } return source; } … //Дальнейшее описание класса будет позже

Как видите, все просто и скупо на код благодаря использованию методов writeFromInputToOutput() и close(), методы просто для понимания, но я отдельно остановлюсь на параметре mode метода writeInternal().

Этот параметр задает разрешения и стратегию работы с фалом и может иметь следующие значиния:

  • MODE_APPEND = 0×00008000 : сообщает о том, что если файл существует, то не нужно затирать содежимое, а дописывать в конец;
  • MODE_PRIVATE = 0×00000000 : говорит о том, что доступ к файлу будет только у приложения, которое его создало;
  • MODE_WORLD_READABLE = 0×00000001 : данной файл смогут читать другие приложения;
  • MODE_WORLD_WRITEABLE = 0×00000002 : данный файл будет доступен для записи другим приложениям;

Все вышеописанные константны явлюят полями класса Context и почитать о них можно на developer.android.com.

Работа с файлами во внешней памяти

У файлов во внешней памяти есть приятная особенность: файлы во внешней памяти могут быть доступны всем приложениям. Для работы с ними применимы следующие методы:

public static File EXTERNAL_DIR = Environment.getExternalStorageDirectory(); //Код пропущен, был описан выше public static boolean writeExternal(InputStream source, String filePath) { if (!CommonIO.isExternalAvailable()) return false; File dest = new File(EXTERNAL_DIR + File.separator + filePath); FileOutputStream writer = null; try { if (!dest.exists()) { dest.getParentFile().mkdirs(); dest.createNewFile(); } writer = new FileOutputStream(dest); CommonIO.writeFromInputToOutput(source, writer); return true; } catch (IOException e) { e.printStackTrace(); return false; } finally { CommonIO.close(writer); } } public static InputStream readExternal(String filePath) { if (!CommonIO.isExternalAvailable()) return null; File source = new File(EXTERNAL_DIR + File.separator + filePath); InputStream out = null; if (source.exists()) { try { out = new FileInputStream(source); } catch (FileNotFoundException e) { e.printStackTrace(); } } return out; }

Константное значение EXTERNAL_DIR необходимо нам по той причине, что в зависимости от системы, путь к смонтированному образу может отличаться. Думаю вы опять заметили, от сколькой рутины нас изабавило наличие утилитарных методов.

Остановлюсь на следующем участке кода:

if (!dest.exists()) { dest.getParentFile().mkdirs(); dest.createNewFile(); }

При создании файла возможна ситуация, когда родительские директории не существуют, чтобы избавится от этой проблемы мы используем dest.getParentFile().mkdirs();.

Итоги

И так, мы введи несколько полезных методов для работы с файлами в Android, оценили полезность создания утилитарных методов. За кадром остался доступ к файлом приложения A из приложения B, возможно это стенет темой следующей статьи.

К заключении хочу отметить, что теперь код большинста примеров с сайта доступен на code.google.com. Надеюсь такое нововведине придется вам по душе

Для тех, кто любит архивы iDevTools.

Happy Coding!

Источник: https://webnewsite.ru/faylovye-operacii-v-android-chtenie-zapit-vo-vnutrennyuyu-vneshnyuyu-pamyat/

Поделиться:
Нет комментариев

    Добавить комментарий

    Ваш e-mail не будет опубликован. Все поля обязательны для заполнения.