Где хранить текстовые файлы

Рейтинг: 2Ответов: 1Опубликовано: 22.12.2014

Учусь кодить под Андроид в Eclipse, до этого писал на Delphi.

Создаю приложение, которое должно работать с небольшими текстами в простом формате txt: создавать, записывать, редактировать. Типа блокнота.

Создаю: private final static String FILENAME = "D:\\readme.txt";

Потом использую: InputStream inputstream = openFileInput(FILENAME);

Результат: программа не может найти этот файл. Скорее всего, я неправильно указываю путь.

Вопросы

  1. Как правильно указывается путь?

  2. Можно ли указать какой-то универсальный каталог для хранения файлов, НО такой, чтобы когда приложение будет установлено на внешнее ус-во (планшет), не вносить изменения в программу? В идеале на SD-карте.

  3. При создании файла apk, созданная папка с файлами txt автоматически упаковалась в пакет.

Ответы

▲ 4Принят

Сначала надо понять, какой файл и откуда вы хотите открыть.

Файлы бывают:

  1. В ресурсах. Например, лежащие в res/raw. Открыть такой файл можно через Resources.openRawResource(). Будет что-то вроде getResources().openRawResource(R.raw.myfile);. Сохранять такие файлы придется в другое место. То, что в пакете не модифицируется. N.B. указывается идентификатор ресурса, а не имя файла. Это, видимо, ответ на ваш пункт 3. Об этом варианте упомянуто в статье.
  2. В директории приложения во внутренней памяти. Чтение openFileInput(FILENAME,...), запись openFileOutput(FILENAME,...). FILENAME - это не путь, а имя файла. Также в статье именно этот вариант разбирается.
  3. В директории приложения во внешней памяти (встроенная память, sd-карта). Доступ к таким фалам делается так (сокращенный кусок кода):

    File file = new File(getExternalFilesDir(null), FILENAME);
    //Для чтения
    InputStream is = new FileInputStream(file);
    byte[] data = new byte[is.available()];
    is.read(data);
    is.close();
    
    //Для записи
    OutputStream os = new FileOutputStream(file);
    os.write(data);
    os.close();
    

    Вероятно, именно про этот вариант вы спрашивали в пункте 2. 4. Для директорий публичных папок пользуемся getExternalStoragePublicDirectory вместо getExternalFilesDir. 5. Для произвольных директорий можно идти от getRootDirectory.

Для директорий приложения (во внутренней памяти, во внешней) система при удалении приложения сама все почистит.

ЗЫ Для 4,5 пунктов требуются разрешения WRITE_EXTERNAL_STORAGE и READ_EXTERNAL_STORAGE в манифесте.
ЗЗЫ Для kitkat и далее есть новые функции для доступа к п.3, см. в доках.
ЗЗЗЫ На самом деле, в той статье достаточно самостоятельный пример, надо было его повторить и потом уже потрошить. Вы начали придумывать задачу на ходу, в итоге вопрос свелся к тому, что надо читать доки...