Das Lesen und Schreiben in eine Datei ist eine Standardfunktionalität jeder Anwendung, die Ereignisse protokolliert, mit Dateien arbeitet, bis hin zur Übertragung von Daten über das Netzwerk. In diesem Artikel betrachten wir Methoden zum Schreiben von Informationen in Dateien und zum Lesen einer aufgezeichneten Zeichenfolge aus einer Datei.
Projektstruktur
Ästhetische Änderungen an den Standardschaltflächen oder ListView werden in dieser Lektion nicht vorgenommen, da wir mit dem arbeiten werden, was vor den Augen des Benutzers verborgen ist, nämlich mit Dateien arbeiten.
Die gesamte Struktur des Projekts besteht diesmal jeweils nur aus einer Klasse: MainActivity
Das Projekt enthält außerdem die folgenden Ressourcendateien:
- Aktivität_main.xml
- Zeichenfolgen.xml
- styles.xml – diese Datei enthält keine projektbezogenen Änderungen.
Außerdem wurden Änderungen an der Datei AndroidManifest.xml vorgenommen. Die folgenden zwei Zeilen müssen der Datei hinzugefügt werden. Dies sind die Berechtigungen für die App zum Lesen und Schreiben auf einen externen Speicher (d. h. die SD-Karte des Telefons). Bei modernen Android-Smartphones werden Informationen in den meisten Fällen auf ein externes Laufwerk geschrieben, obwohl der durchschnittliche Benutzer dieses Laufwerk als solches ansieht intern, da es eingebaut ist, aber aus Sicht des Betriebssystems ist dieses Laufwerk (dh die SD-Karte) ein externes Laufwerk. In diesem Artikel wird die Möglichkeit, mit einem echten internen Laufwerk zu arbeiten, nicht berücksichtigt.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="ru.evileg.workwithfiles" > <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ... </manifest>
Bildet das Markup der Anwendung
Aktivität_main.xml
Das Markup der Hauptaktivität, in der unsere Anwendung funktionieren wird. In diesem Markup gibt es nur zwei Schaltflächen (Button) und ein Textfeld (TextView), in dem wir die in der Datei gespeicherten Informationen anzeigen.
<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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:background="#ffffff" android:orientation="vertical" tools:context=".MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/write_file" android:id="@+id/buttonWrite" android:layout_gravity="center_horizontal" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/read_file" android:id="@+id/buttonRead" android:layout_gravity="center_horizontal" /> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/textView" android:textSize="26sp" android:layout_gravity="center_horizontal" /> </LinearLayout>
Zeichenfolgen.xml
Android-Textressourcendatei. Das Vorbereiten aller Zeichenfolgen, die in Ihrer Anwendung verwendet werden, in dieser Datei ist nicht nur eine gute Form, sondern eine Voraussetzung für die Entwicklung einer qualitativ hochwertigen Anwendung. Denn wenn Sie sich disziplinieren, alle diese Informationen in dieser Datei aufzubewahren, zahlt es sich später aus, wenn Sie die Anwendung in andere Sprachen übersetzen. Darüber hinaus verfügt Android Studio dafür über eine praktische Funktion.
<resources> <string name="app_name">Work With Files</string> <string name="hello_world">Hello world!</string> <string name="action_settings">Settings</string> <string name="write_done">Запись выполнена</string> <string name="write_file">Записать данные в файл</string> <string name="read_file">Считать данные из файла</string> </resources>
Stile.xml
Es gibt keine projektbezogenen Änderungen in dieser Datei. Beim Erstellen eines Projekts wird das Standarddesign jedoch nicht von Android Studio gerendert. Bei der Vorschau und im Entwurfsmodus werden Fehler ausgegeben. Um dies zu vermeiden, notieren Sie die folgenden Informationen anstelle der alten.
<resources> <!-- Base application theme. --> <style name="AppTheme" parent="Base.Theme.AppCompat.Light"/> </resources>
Hauptprojektklasse - MainActivity.java
Heute ist der gesamte Programmcode in dieser Klasse konzentriert. In dieser Klasse wird das Erscheinungsbild der Haupttätigkeit gebildet und auch die Arbeit mit Dateien organisiert.
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(); } } }
Insgesamt
Wenn beim Studium des Materials keine Probleme und Fehler aufgetreten sind, wird durch Drücken der Schaltfläche zum Schreiben in eine Datei eine neue Datei erstellt und die Zeichenfolge "Hello World" geschrieben. Durch Drücken der Lesetaste werden die in der Textdatei gespeicherten Informationen angezeigt. Der Vorgang ist in den folgenden Screenshots dargestellt.
Durch Drücken der Schaltfläche werden die Informationen in die Datei geschrieben
In Datei schreiben
Das Lesen aus einer Datei erfolgt durch Drücken der entsprechenden Schaltfläche. In diesem Fall wird der Text im TextView angezeigt
Datei hell.txt im Dateimanager erstellt
Как я понял данное приложение сохраняет текст в один единственный файл - hello.txt. Хотел бы узнать как можно реализовать функцию создания новый текстовых файлов и их переименования, т.е после нажатия на кнопку сохранения будет создаваться новый текстовый файл, пользователь будет выбирать куда не телефоне его сохранить и сам же вводит имя файла. А так же как реализовать функцию выбора из каталога файлов, т. е при нажатие на кнопку "считать из файла" открывалась бы папка в которой у пользователя находятся другие текстовые документы и он мог их редактировать последующего редактирования.
эххх... как это было давно и не правда )))) я с тех пор (через пару месяцев после этой статьи +-) на Java и не писал больше.
Вот если меня накроет не по-детски и я всё-таки начну писать сравнительные статьи Android: Java vs Qt , вот тогда что-нибудь интересное и вывалится на эту тему. А так пока... даже не знаю, что Вам ответить.