- How can I read a text file in Android?
- 7 Answers 7
- Работа с файловой системой
- Файл в ОС Android. Операции чтения и записи
- Структура проекта
- Формирование разметки приложения
- activity_main.xml
- strings.xml
- styles.xml
- Основной класс проекта - MainActivity.java
- Итог
- How do I read the file content from the Internal storage - Android App
- 6 Answers 6
How can I read a text file in Android?
I want to read the text from a text file. In the code below, an exception occurs (that means it goes to the catch block). I put the text file in the application folder. Where should I put this text file (mani.txt) in order to read it correctly?
try < InputStream instream = openFileInput("E:\\test\\src\\com\\test\\mani.txt"); if (instream != null) < InputStreamReader inputreader = new InputStreamReader(instream); BufferedReader buffreader = new BufferedReader(inputreader); String line,line1 = ""; try < while ((line = buffreader.readLine()) != null) line1+=line; >catch (Exception e) < e.printStackTrace(); >> > catch (Exception e)
@Sandip actually i copied text file (mani.txt) and put it into the folder of android application(folder having .settings , bin,libs,src,assets,gen,res,androidmanifeast.xml)
7 Answers 7
I assume your text file is on sd card
//Find the directory for the SD Card using the API //*Don't* hardcode "/sdcard" File sdcard = Environment.getExternalStorageDirectory(); //Get the text file File file = new File(sdcard,"file.txt"); //Read text from file StringBuilder text = new StringBuilder(); try < BufferedReader br = new BufferedReader(new FileReader(file)); String line; while ((line = br.readLine()) != null) < text.append(line); text.append('\n'); >br.close(); > catch (IOException e) < //You'll need to add proper error handling here >//Find the view by its id TextView tv = (TextView)findViewById(R.id.text_view); //Set the text tv.setText(text.toString());
following links can also help you :
Работа с файловой системой
Работа с настройками уровня 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 = 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 = 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 мы сможем найти сохраненный файл.
Файл в ОС Android. Операции чтения и записи
Операции чтения и записи в файл являются стандартным функционалом любых приложений, которые ведут журналирование событий, работу с файлами, вплоть до передачи данных по сети. В данной статье рассмотрим методы записи в файлы информации и чтения из файла записанной строки.
Структура проекта
Эстетических изменений стандартных кнопок или ListView в данном уроке производиться не будет, поскольку мы будем работать с тем, что скрыто от глаз пользователя, а именно работать с файлами. Вся структура проекта соответственно состоит на этот раз лишь из одного класса: MainActivity Также в проекте присутствуют следующие файлы ресурсов:
- activity_main.xml
- strings.xml
- 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 //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 в файловом менеджере
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Рекомендуемые статьи по этой тематике
По статье задано0 вопрос(ов)
Вам это нравится? Поделитесь в социальных сетях!
How do I read the file content from the Internal storage - Android App
I am a newbie working with Android. A file is already created in the location data/data/myapp/files/hello.txt ; the contents of this file is "hello". How do I read the file's content?
6 Answers 6
To read data from internal storage you need your app files folder and read content from here
String yourFilePath = context.getFilesDir() + "/" + "hello.txt"; File yourFile = new File( yourFilePath );
Also you can use this approach
FileInputStream fis = context.openFileInput("hello.txt"); InputStreamReader isr = new InputStreamReader(fis); BufferedReader bufferedReader = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null)Note sure where this is applicable, but there is a separator string in the File class. I guess you should use then File.separator instead of "/"
Read a file as a string full version (handling exceptions, using UTF-8, handling new line):
// Calling: /* Context context = getApplicationContext(); String filename = "log.txt"; String str = read_file(context, filename); */ public String read_file(Context context, String filename) < try < FileInputStream fis = context.openFileInput(filename); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader bufferedReader = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) < sb.append(line).append("\n"); >return sb.toString(); > catch (FileNotFoundException e) < return ""; >catch (UnsupportedEncodingException e) < return ""; >catch (IOException e) < return ""; >>
Note: you don't need to bother about file path only with file name.
Call To the following function with argument as you file path:
private String getFileContent(String targetFilePath) < File file = new File(targetFilePath); try < fileInputStream = new FileInputStream(file); >catch (FileNotFoundException e) < Log.e("", "" + e.printStackTrace()); >StringBuilder sb; while (fileInputStream.available() > 0) < if (null == sb) < sb = new StringBuilder(); >sb.append((char) fileInputStream.read()); > String fileContent; if (null != sb) < fileContent = sb.toString(); // This is your file content in String. >try < fileInputStream.close(); >catch (Exception e) < Log.e("", "" + e.printStackTrace()); >return fileContent; >