Android Studio: не удается открыть файл после перезапуска приложения

#java #android #file

#java #Android #файл

Вопрос:

если я нажму кнопку, будет создан файл, и в файл будет записано целочисленное значение. Если я нажму другую кнопку, значение будет извлечено из файла. Если я закрою приложение и перезапущу его, файл не будет найден. Это потому, что файл создан в Android: метод onCLick?

вот два метода:

Запись:

  public void buttonAddClick (View view){

    file = new File(directory, "file"   c.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH)   ".txt");
    if (!file.exists()) {
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try {
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file,true));
        bufferedWriter.append(editAm.getText());
        bufferedWriter.append("n");
        bufferedWriter.close();
        editAm.setText(null);
    } catch (IOException e) {
        e.printStackTrace();
    }

}
  

Читать:

 public void buttonShowClick(View view) {


    try {
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        zwischensumme = 0;
        String line;

        while ((line = bufferedReader.readLine()) != null) {
            zwischensumme  = Double.parseDouble(line);
            line = "";
        }
        bufferedReader.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
      catch (NumberFormatException e){
        e.printStackTrace();
        file.delete();
    }

}
  

Комментарии:

1. Что говорит logcat?

2. Что у вас есть directory , в котором хранится файл? внутреннее хранилище, внешнее или временное?

3. @Kilanny это внутренний: новый файл (getFilesDir() » /», MP);

4. Попробуйте отладить ваше приложение. Посмотрите имя вашего файла в первый раз, затем запустите его снова и убедитесь, что выполняется доступ к тому же имени файла

5. Вам не нужно "/" в вашей строке из комментария. Кроме того, вы добавляете дополнительное пространство, если вы скопировали его дословно из своего исходного кода.

Ответ №1:

Похоже, вы можете получить NumberFormatException .
Проверьте stacktrace, чтобы увидеть, попадаете ли вы в catch (NumberFormatException e) блок.
Если вы попадаете в этот блок, то файл действительно удаляется из-за вашего блока catch :

 catch (NumberFormatException e){
        e.printStackTrace();
        file.delete();
    }
  

Также Герман Клекер прав. Вы называете свой файл на основе даты и времени.
Вы не показываете, как вы извлекаете файл в части чтения. Основано ли это на имени файла?

Поскольку вы можете не знать имя файла (из-за соотношения даты и времени), сделайте что-то подобное в onResume if (file == null) :

 File directory = new File("/path/to/directory");
File[] foundFiles = directory.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.startsWith("file");
    }
});

if (!foundFiles.isEmpty()) {
  file = foundFiles[0];
}
  

Таким образом, если имя первого файла начинается с ‘file’, оно будет использовано

Ответ №2:

Вы можете запутаться с вашей файловой переменной. Похоже, это переменная экземпляра вашего класса. Он устанавливается в buttonAddClick. Когда вы снова запускаете свое приложение, оно не создается, а используется в buttonShowClick (насколько мы можем видеть).

Я предполагаю, что это null.