Сохранение файлов

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

http://developer.android.com/guide/topics/data/data-storage.html#filesInternal

но я не могу заставить это работать на моем тестовом устройстве. Я также попытался создать файл, используя методы, доступные в java.io.File, с помощью соответствующих методов. Я также попытался создать файл на SDCard с тем же результатом, не удалось. Я перепробовал много решений, перечисленных в других ответах, точно следуя предложенному коду и инструкциям, и нашел тот же результат. Я начинаю чувствовать, что мне не хватает какого-то важного фрагмента кода или флага установки где-то, я установил разрешение в файле манифеста:

  <uses-permission 
        android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


Чтобы было понятно, я пытаюсь записать во внутреннее, частное хранилище устройства. Это небольшой файл, содержащий имя, номер телефона и пару типовint флаги. Какой бы метод я ни использовал, я либо обнаружил, что файл не был создан (или изменился, если я поместил файл вручную на SDCard), либо я получил исключение NullPointerException, когда попытался сослаться на файл или местоположение файла:

private              File   fILE = new File("Mydata", main.FILENAME);

или же

private              File   fILE  = getDir("Mydata", 0);


Я запускаю код на HTC Hero, обновленный до последней версии сервиса от Sprint. Любая помощь будет с благодарностью, заранее спасибо!

-Стив

Обновление (02.02.11): при использовании EVO (API 8) я все еще получаю исключение NullPointerException. Код, генерирующий исключение, приведен ниже, есть мысли о том, почему мое приложение не может получить доступ к внутренней памяти? У меня есть эта проблема на трех разных физических устройствах, использующих два уровня API (API 7 и 8).

    File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt");

ОБНОВЛЕНИЕ 2: 4/4/11 - Я обнаружил, что ни при каких обстоятельствах не могу увидеть файловую структуру на физическом устройстве (в каталоге данных). У кого-нибудь есть мысли по этому поводу? Устройство правильно настроено и может запускать приложение из eclipse или adb.

ОБНОВЛЕНИЕ 3: (9/9/11) - Я думаю, что, возможно, нашел, в чем проблема, но я не уверен, как с этим бороться. Я выяснил, что права доступа к каталогу / data / на физических устройствах:drwxrwx--x, Я не уверен, почему это так, может быть, что-то с Sprint? Я нашел этот набор таким образом на HTC Hero, Samsung Epic (Galaxy S) и HTC EVO на Sprint. Проблема заключается в том, что у DDMS и моего приложения нет прав на доступ к каталогу. Мне нужно выяснить 2 вещи здесь, почему это так и как преодолеть эту проблему в дикой природе. Опять же, любая помощь здесь будет УДИВИТЕЛЬНОЙ !!

ОБНОВЛЕНИЕ 4: Я думаю, что прошлый февраль был для меня моментом блондинки (см. ОБНОВЛЕНИЕ 3). Тестовые устройства, которые у меня есть, не ROOTed и, следовательно, нет доступа (DUH!). После всех обновлений, которые прошли SGS и EVO 4G, результат остается прежним. Я все еще работаю над этой проблемой и постараюсь вернуться сюда с обновлением в ближайшее время (надеюсь, менее чем через год в следующий раз).

 Kingsolmn27 янв. 2011 г., 20:58
Я концентрируюсь наopenFileOutput() прямо сейчас, и я получаю исключение NullPointerException. Кажется, что личный каталог данных на телефоне почему-то заблокирован, я даже не могу посмотреть каталог; это как ничто не создает там. Права доступа к каталогу данных на телефоне: «drwxrwx - x». Я начинаю задаваться вопросом, есть ли неправильная настройка на телефоне или что-то. Для совместимости приложение требует, чтобы файл данных записывался во внутреннее хранилище.
 Kingsolmn18 февр. 2011 г., 18:29
Я могу написать нормально, используя класс File на эмуляторе. это странная часть, я должен иметь root-доступ на телефоне, не так ли?
 techiServices18 февр. 2011 г., 09:44
вы не сможете получить доступ к каталогу / data на физическом устройстве с помощью DDMS, если у вас нет корневого доступа, но вы все равно сможете записывать в файл из своего приложения. что происходит на эмуляторе? ты можешь написать файл хорошо?
 Chris Thompson27 янв. 2011 г., 19:11
Получаете ли вы сообщение об ошибке, когда пытаетесь использовать эти разные методы, или оно просто молча терпит неудачу?
 techiServices18 февр. 2011 г., 19:01
У вас не будет root-доступа на реальном устройстве, если выroot ОС. Что я бы не предложил. У меня есть Google Dev Phone 2, и даже не имеет root-доступа. Можете ли вы опубликовать трассировку стека из Logcat? Нет смысла, что он работает на эмуляторе, но ни на одном из ваших устройств.

Ответы на вопрос(6)

Решение Вопроса

я заметил, что вы не хотите хранить тонны данных в вашем файле. Будет ли достаточной альтернативой вместо этого использовать общие настройки?

И, возможно, еще более интересно: возникает ли проблема, даже если вы вместо этого записываете файл Shared Preferences?

http://developer.android.com/guide/topics/data/data-storage.html#pref

 dbm23 февр. 2011 г., 12:16
Йеай! :-) Похоже, ваша непосредственная проблема решена, по крайней мере. Рад, что смог помочь (спасибо за зеленую галочку) :-)
 Kingsolmn23 февр. 2011 г., 07:13
С помощьюSharedPreferences работает на физическом устройстве. Смотрите мой ответ ниже для пустых предположений относительно того, что здесь произошло. @dbm
 Kingsolmn18 февр. 2011 г., 18:25
Я не могу просмотреть / программно получить доступ к каталогу / data / на любом физическом устройстве. Я не запускал свое приложение на физическом устройстве с тех пор, как перешел на SharedPreferences, но я знаю, что все еще не могу просмотреть каталог. Я использую Eclipse 3.5 classic, USB-драйверы HTC, все обновлены до последней версии.

/data/ Каталог доступен только пользователю root. Поскольку единственный реалистичный способ получить этот доступ на физическом устройстве - это получить root-права на устройство, обозреватель файлов DDMS не может попасть в эту ветвь дерева каталогов.

Что касается того, почему приложение не будет писать там, вероятно, проблема в том, что я подписал приложение с помощью ключей отладки (не большой эксперт по * NIX, но, как мне кажется, это так из моего личного исследования).

File newfile = new File(this.getFilesDir() + "/data/files/", "sample.txt");

чтобы:

File newfile = new File(this.getFilesDir() + "/","sample.txt");
 Hi I'm Frogatto16 окт. 2017 г., 14:21
Thers не нужно для+ "/".

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

И это работает отлично. Я бы сказал, что не следует указывать полный путь к файлу, например: / data / ..., чтобы создать файл (для создания файла необходимо иметь соответствующие права). Позвольте платформе Android сделать работу по созданию личного файла для вашего приложения.

ния, поэтому пользователь должен иметь root-доступ (корневое устройство) для создания и загрузки файлов. Если у вас есть рутированное устройство, вот как записать файл во внутреннее хранилище:

 // Create a file in the Internal Storage

String fileName = "MyFile";
String content = "hello world";

FileOutputStream outputStream = null;
try {
outputStream = openFileOutput(fileName, Context.MODE_APPEND);
outputStream.write(content.getBytes());
outputStream.close();
} catch (Exception e) {
  e.printStackTrace();
}

Это должно немедленно создать файл с именемМой файл с содержаниемПривет, мир, Каталог внутреннего хранилища обычно находится в специальном месте, указанном именем пакета нашего приложения. В моем случае это / data / data / [имя пакета], а созданные файлы хранятся в каталоге с именем files в этом каталоге.

лучше не использовать путь к файлу. Но вместо этого используйте только имя файла для создания файла. Что-то вроде этого:

public static void saveTextToFile(Context context, String filename, String content) {
  try {
     FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
     fos.write(content.getBytes());
     fos.close();
  } catch (Exception e) {
     e.printStackTrace();
  }
}

И чтобы получить файл, вы можете использовать:

File file = new File(context.getFilesDir(), filename);

Читать далее:Сохранение файлов.

Ваш ответ на вопрос