Evgenii Legotckoi
Evgenii Legotckoi30. Juli 2015 21:06

Die Datei auf dem Android-Betriebssystem. Lese- und Schreiboperationen

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:

  1. Aktivität_main.xml
  2. Zeichenfolgen.xml
  3. 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

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Stabiles Hosting des sozialen Netzwerks EVILEG. Wir empfehlen VDS-Hosting für Django-Projekte.

Magst du es? In sozialen Netzwerken teilen!

A
  • 6. November 2017 09:18

Как я понял данное приложение сохраняет текст в один единственный файл - hello.txt. Хотел бы узнать как можно реализовать функцию создания новый текстовых файлов и их переименования, т.е после нажатия на кнопку сохранения будет создаваться новый текстовый файл, пользователь будет выбирать куда не телефоне его сохранить и сам же вводит имя файла. А так же как реализовать функцию выбора из каталога файлов, т. е при нажатие на кнопку "считать из файла" открывалась бы папка в которой у пользователя находятся другие текстовые документы и он мог их редактировать последующего редактирования.

Evgenii Legotckoi
  • 6. November 2017 14:41

эххх... как это было давно и не правда )))) я с тех пор (через пару месяцев после этой статьи +-) на Java и не писал больше.
Вот если меня накроет не по-детски и я всё-таки начну писать сравнительные статьи Android: Java vs Qt , вот тогда что-нибудь интересное и вывалится на эту тему. А так пока... даже не знаю, что Вам ответить.

Kommentare

Nur autorisierte Benutzer können Kommentare posten.
Bitte Anmelden oder Registrieren
Letzte Kommentare
ИМ
Игорь Максимов5. Oktober 2024 07:51
Django – Lektion 064. So schreiben Sie eine Python-Markdown-Erweiterung Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55. Juli 2024 11:02
QML - Lektion 016. SQLite-Datenbank und das Arbeiten damit in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssr8. Februar 2024 18:43
Qt Linux - Lektion 001. Autorun Qt-Anwendung unter Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
Qt WinAPI - Lektion 007. Arbeiten mit ICMP-Ping in Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25. Dezember 2023 10:30
Boost - statisches Verknüpfen im CMake-Projekt unter Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
Jetzt im Forum diskutieren
J
JacobFib17. Oktober 2024 03:27
добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
JW
Jhon Wick1. Oktober 2024 15:52
Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
КГ
Кирилл Гусарев27. September 2024 09:09
Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
F
Fynjy22. Juli 2024 04:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

Folgen Sie uns in sozialen Netzwerken