Ошибки чтения и записи в текстовый файл

Я разрабатываю приложение, в котором пользователь помещает некоторую числовую информацию в некоторые текстовые поля, приложение должно записывать информацию в текстовый файл для последующего использования, например, при следующем открытии приложения или нажатии кнопки обновления числа должны быть прочитаны из файла и загружены в те же текстовые поля, чтобы пользователь мог изменить их при необходимости. Хотя обе функции «писатель» и «загрузчик», похоже, работают, проблема в том, что каждый раз, когда вызывается «загрузчик», он загружает данные из какого-то ранее сохраненного файла, а не из файла, который создается прямо сейчас «писателем». ". Если пользователь хочет, чтобы новые сохраненные данные были загружены в текстовые поля, ему необходимо закрыть и снова открыть приложение. Чтобы лучше объяснить ситуацию, я поместил сценарий после кодов. Есть идеи, что не так и что можно сделать?

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

    public void writer(View view){                               
    try {

        FileOutputStream fos = openFileOutput("myfilename", Context.MODE_WORLD_WRITEABLE | Context.MODE_WORLD_READABLE);
        PrintStream prntst = new PrintStream(fos);
        txtEditor=(EditText)findViewById(R.id.editText1);
        prntst.println (txtEditor.getText().toString());
        txtEditor=(EditText)findViewById(R.id.EditText02);
        prntst.println (txtEditor.getText().toString());   
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }       
}

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

    public void reader(View view){
    try {

        BufferedReader inputReader = new BufferedReader(new InputStreamReader(openFileInput("myfilename")));            
        Scanner scanner = new Scanner(inputReader);     
        while (scanner.hasNextLine()) {             
              String line = scanner.nextLine();
              bld.add(line);
            }

        inputReader.close();
        scanner.close();
        txtEditor=(EditText)findViewById(R.id.editText1);
        txtEditor.setText(bld.get(0));          
        txtEditor=(EditText)findViewById(R.id.EditText02);
        txtEditor.setText(bld.get(1));


    } catch (IOException e) {
        e.printStackTrace();            
        txtEditor=(EditText)findViewById(R.id.editText1);
        bld.add((txtEditor.getText().toString()));
        txtEditor=(EditText)findViewById(R.id.EditText02);
        bld.add((txtEditor.getText().toString()));           
    }
}

Сценарий:

  1. Пользователь открывает приложение, есть некоторые значения по умолчанию в текстовых полях (два текстовых поля), пользователь меняет значения на 2 и 3 соответственно и касается кнопки сохранения.
  2. Пользователь снова меняет значения, но вместо нажатия кнопки сохранения он нажимает кнопку загрузки, теперь приложение должно загружать 2 и 3 в поля (которые сохраняются), но вместо этого загружает значения по умолчанию.
  3. Пользователь закрывает приложение и снова открывает их, на этот раз 2 и 3 отображаются по умолчанию в текстовых полях. Похоже, "загрузчик" СЕЙЧАС читает данные из ранее сохраненного файла.
  4. Пользователь меняет значения с «2 и 3» на «13 и 14» и нажимает кнопки сохранения и загрузки соответственно, но 2 и 3 загружаются в поля.
  5. Пользователь закрывает и снова открывает приложение, на этот раз отображаются 13 и 14.

PS. переменная bld является глобальной и определяется в MainActivity:

    ArrayList<String> bld = new ArrayList<String>();

Спасибо,


person user2452253    schedule 04.06.2013    source источник
comment
Для удобства чтения добавьте пустую строку после Scenario:, чтобы текст отображался в виде упорядоченного списка.   -  person Torben Kohlmeier    schedule 04.06.2013
comment
Спасибо за комментарий, вообще-то я новичок на этом форуме. Я сохраню ваш совет на случай следующего поста.   -  person user2452253    schedule 05.06.2013


Ответы (2)


Проблема может быть в глобальной переменной ArrayList «bld». Можно определить его глобально, но инициализировать его локально.

Проблема в том, что вы вызываете как bld.get(0), но после него добавляются новые значения.

Добавьте строку bld = new ArrayList<String>(); в функцию «считыватель».

person Nizam    schedule 04.06.2013

В методе записи вы закрываете поток вывода файла:

fos.close();

Но, конечно же, вместо этого вам следует закрыть поток печати.

prntst.close();

Закрытие потока печати очистит поток, а затем закроет базовый поток вывода. Когда вы закрываете выходной поток, он ничего не будет знать о потоке печати, созданном поверх него, поэтому не будет знать, как его сбросить.

person James Holderness    schedule 04.06.2013
comment
Спасибо за ваш ответ и отзыв. Я попробовал, но проблема все еще существует. Я также пробовал промывать с помощью prntst.flush (); :( - person user2452253; 04.06.2013
comment
Взгляните на ответ Низама - я думаю, он мог заметить настоящую проблему. - person James Holderness; 04.06.2013