возникли проблемы при чтении и записи на внутреннюю память Android - PullRequest
3 голосов
/ 27 июня 2010

Я пишу простое бюджетное приложение для себя, и мне сложно понять, как писать во внутреннюю память.Кажется, я не пишу в файл должным образом, и я не могу найти более подробных примеров, чем статья Хранение данных на developer.android.com

По сути, яЯ пытаюсь записать тестовое значение в файл MyBalance, а затем прочитать его в балансе.В моем реальном коде я использую операторы try / catch для операций ввода / вывода файла, но я пропустил их, чтобы сделать код более читабельным.

float test = 55;
float balance;
byte[] buffer = null;
FileOutputStream fos = openFileOutput( "MyBalance", Context.MODE_PRIVATE );
fos.write(Float.floatToRawIntBits(balance));
fis.read(buffer); //null pointer
ByteBuffer b = ByteBuffer.wrap(buffer);
balance=b.getFloat();

В этом вся суть, каждый видит, что ячто-то не так?

Редактировать: Спасибо за ответ, я пошел дальше и преобразовал в / из строки, как вы предложили, но я все еще не думаю, что файл создается.У меня есть оператор if, который читает из него, если он существует в onResume () и он не запускается.Позвольте мне опубликовать часть моего кода.

Вот как я пишу файл (setbal - это EditText, а balanceview - это TextView):

 balance = Float.valueOf(setbal.getText().toString());
 balanceview.setText(setbal.getText());
 balstring = String.valueOf(balance);
 for (int i = 0; i < balstring.length(); ++i)
     try {
     fos.write((byte)balstring.charAt(i));
     } catch (IOException e) {
         e.printStackTrace();
     }

Я проверяю, существует ли файл вonResume () примерно так:

File file = new File("data/data/com.v1nsai.mibudget/balance.txt");

Это где внутренний файл для этого контекста будет храниться?

1 Ответ

5 голосов
/ 27 июня 2010

Так что это не совсем то, что вы просили, но именно так у меня это работает для Strings, и вам может быть полезно посмотреть.(Конечно, вы можете пометить примитивы и добавить их в строку, если хотите использовать этот код.)

Запись

FileOutputStream fos = context.openFileOutput("savedstate.txt", 0);

for (int i = 0; i < out.length(); ++i)
    fos.write((byte)out.charAt(i));

Чтение

StringBuilder inb = new StringBuilder();

FileInputStream fis = this.mContext.openFileInput("savedstate.txt");

int ch;
while((ch = fis.read()) != -1)
    inb.append((char)ch);

Обновление

Одна мысль, которая приходит на ум, заключается в том, что вы можете не захотеть доверять, используя объект File с полным путем, введенным рукой, к файлу.Вместо этого просто используйте FileInputStream с объектом контекста и относительным путем, как в моем коде, а затем посмотрите, получите ли вы строку String некоторой длины или что-то в этом роде, или исключение, что файл не существует.

Если вам действительно интересно, где создается файл, или вы хотите увидеть его своими глазами, я думаю, вы можете просмотреть его на своем телефоне через файловый менеджер в DDMS.

И последнее.Я бы предложил переместить блок try / catch за пределы цикла записи.Поскольку повторяется идентичная задача, нет необходимости в дополнительном использовании этого подхода, хотя, как правило, рекомендуется минимизировать размер блоков try / catch.

Ладно, еще одна вещь, есливы хотите использовать объект File с полным путем, возможно, вы захотите, чтобы путь был следующим:

File file = new File("/data/data/com.v1nsai.mibudget/balance.txt");

Начальная косая черта может иметь все значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...