FileoutputStream/буферридер

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

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

Эта линия снова и снова.

android.widget.TextView{41852c0 VFED.VCL ..... ID32,316-419,351 #7f09000a app:id/tvHistory}

Мой собственный код:

final static String FILENAME = "marks.txt";
mNotenHistory=(TextView)findViewById(R.id.tVhistory);
mNotenHistory.setMovementMethod(new ScrollingMovementMethod());

private void loadTextfromFile()
    {
        File f = new File(getFilesDir(),FILENAME);
        try {
            BufferedReader br = new BufferedReader(new FileReader(f));
            String line;
            try {
                while ((line = br.readLine()) != null)
                {
                    mNotenHistory.setText(line+"\n"+mNotenHistory.getText());
                }
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

@Override
    public void onClick(View view)
    {
       [...]

           mNotenHistory.setText(mNotenHistory.getText() + "\n" + string_note);
           String noten_history_string = String.valueOf(mNotenHistory);
           try {
               FileOutputStream fo = openFileOutput(FILENAME, Context.MODE_APPEND);
               fo.write(noten_history_string.getBytes());
               fo.write("\n".getBytes());

           } catch (FileNotFoundException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }


       }

person Qpa    schedule 30.06.2013    source источник
comment
Не забывайте закрывать все потоки после их использования, иногда они создают утечки памяти и искажают вывод.   -  person kaushal trivedi    schedule 01.07.2013


Ответы (2)


Вот оскорбительная строка:

String noten_history_string = String.valueOf(mNotenHistory);

Посмотрите на это определение из документации Android:

public static String valueOf(Object value)

Добавлено в API уровня 1

Преобразует указанный объект в его строковое представление. Если объект имеет значение null, верните строку "null", в противном случае используйте toString(), чтобы получить строковое представление.

Класс TextView наследует toString() от класса View. Вот его определение:

public String toString () Добавлено в уровень API 1

Возвращает строку, содержащую краткое, удобочитаемое описание этого объекта. Подклассам рекомендуется переопределять этот метод и предоставлять реализацию, учитывающую тип и данные объекта. Реализация по умолчанию эквивалентна следующему выражению: getClass().getName() + '@' + Integer.toHexString(hashCode())

Так что это ваша проблема. String.valueOf(mNotenHistory) не дает вам текст в текстовом представлении. Таким образом, вы записываете что-то еще (в частности, указанную вами строку) в свой файл. Чтобы получить текст из вашего TextView, используйте вместо этого метод getText(). Вот как должна выглядеть строка:

String noten_history_string = mNotenHistory.getText();
person AbsentMoniker    schedule 30.06.2013
comment
Спасибо за объяснение, но он все еще не работает. Если я изменю эти строки, Android Studio выдаст ошибку. Требуемые несовместимые типы: java.lang.String Found: java.lang.CharSequence. Быстрое исправление будет -> Приведение к java.lang.String или Wrap с использованием String.ValueOf, и тогда оно работает, но не совсем так, как я хочу. - person Qpa; 01.07.2013
comment
Когда вы вносите изменения, что записывается в ваш текстовый файл? - person AbsentMoniker; 01.07.2013
comment
Если я пишу в TextView 6.0\n 1.0 и он правильно отображается в телевизоре. Если я закрою/убью приложение и просмотрю файл вручную с помощью root explorer, появится \n 1.0 \n 1.0 \n 6.0. Если я перезапущу приложение, останется только версия 6.0. - person Qpa; 02.07.2013
comment
Проблема решена - › я написал весь текст в файле, а не только одну запись.... - person Qpa; 02.07.2013
comment
Очень хорошо! Я бы порекомендовал написать полный ответ, чтобы людям не приходилось искать решение в комментариях. - person AbsentMoniker; 03.07.2013

Краткое резюме, что я хочу сделать.

TextView A получает результат уравнения, которое ясно после каждого нового вычисления. Чтобы сохранить результат, есть TextView B. Результаты должны записываться снизу вверх в TextView B, чтобы самые новые были сверху. В то же время он должен записать содержимое TextView в файл.

После закрытия/убийства приложения и его повторного открытия TextView B покажет все сохраненные данные.

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

person Qpa    schedule 01.07.2013