#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.