Понимание простого синтаксического анализатора XML — новый вывод в файл — Java

Я пытаюсь научиться использовать Simple XML Framework, как подробно описано в этом потоке: Лучшие практики для синтаксического анализа XML.

Я использую следующий код:

public class SimpleXMLParserActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.main);

    Serializer serializer = new Persister();
    Example example = new Example("Example message", 123);
    File result = new File("example.xml");

    try {
        Log.d("Start", "Starting Serializer");
        serializer.write(example, result);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.d("Self", "Error");
        e.printStackTrace();
    }
}
}

У меня проблема с пониманием строки

File result = new File("example.xml");

1) Эта строка создает в моем приложении новый файл с именем example.xml? Если да, то где находится этот файл.

2) Или эта строка ищет существующий файл с именем example.xml, а затем добавляет к нему? Если да, то где должен быть размещен файл example.xml в моем комплекте приложений, чтобы его можно было найти. Я заметил, что в данный момент я получаю сообщение об ошибке:

java.io.FileNotFoundException: /example.xml (Read-only file system)

Спасибо.


person GuybrushThreepwood    schedule 18.04.2012    source источник


Ответы (4)


File result = new File("example.xml")

Эта строка просто сохранит имя файла «example.xml» в новом объекте File. Нет проверки, существует ли этот файл на самом деле, и он также не пытается его создать.

Файл без указания абсолютного пути (начинающийся с /, например new File("/sdcard/example.xml")) считается находящимся в текущем рабочем каталоге, который, я думаю, является / для приложений Android (-> /example.xml (Read-only file system))

Я предполагаю, что serializer.write(example, result); пытается создать фактический файл для вас, но терпит неудачу, так как вы не можете писать в «/».

Вы должны указать путь к этому файлу. Есть несколько мест, где вы можете хранить файлы, например.

  • Context#getFilesDir() даст вам поместите в домашний каталог вашего приложения (/data/data/your.package/files/), где только вы можете читать/писать - без дополнительных разрешений.
  • Environment#getExternalStorageDirectory() предоставит вам общее основное хранилище (может быть /sdcard/ - но это совсем другое для устройств). Чтобы написать сюда, вам потребуется разрешение WRITE_EXTERNAL_STORAGE.
  • в Environment доступно больше мест, которые являются более специализированными. Например. для медиафайлов, загрузок, кэширования и т. д.
  • есть также Context#getExternalFilesDir() для личных (больших) файлов приложения, которые вы хотите хранить во внешнем хранилище (что-то вроде /sdcard/Android/data/your.package/)

чтобы исправить ваш код, вы могли бы сделать

File result = new File(Environment.getExternalStorageDirectory(), "example.xml");

Изменить: либо используйте предоставленные механизмы для получения существующего каталога (предпочтительно, но вы ограничены папками, которые вы должны использовать):

// via File - /data/data/your.package/app_assets/example.xml
File outputFile = new File(getDir("assets", Context.MODE_PRIVATE), "example.xml");
serializer.write(outputFile, result);

// via FileOutputStream - /data/data/your.package/files/example.xml
FileOutputStream outputStream = openFileOutput("example.xml", Context.MODE_PRIVATE);
serializer.write(outputStream, result);

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

File outputFile = new File(new File(getFilesDir().getParentFile(), "assets"), "example.xml");
outputFile.mkdirs();
serializer.write(outputFile, result);

Старайтесь не указывать полные пути, такие как "/data/data/com.simpletest.test/assets/example.xml", так как они могут отличаться на других устройствах/версиях Android. Даже / не обязательно будет /. Вместо этого безопаснее использовать File.separatorChar, если вам нужно.

person zapl    schedule 18.04.2012
comment
Спасибо. Я изменил код на: File result = new File(/data/data/com.simpletest.test/assets/example.xml); Однако теперь я получаю сообщение об ошибке, что файл не может быть найден? - person GuybrushThreepwood; 18.04.2012
comment
см. редактирование в ответе. Вероятно, вам нужно сначала создать папку assets или использовать один из других (лучших) способов. - person zapl; 18.04.2012

2 решения, чтобы сделать это чисто:

  1. используйте openFileOutput для записи частного файла в частный каталог приложения (который может быть расположен во внутренней памяти или во внешнем хранилище, если приложение было перемещено туда). Фрагмент см. здесь.
  2. или используйте конструктор файлов чтобы создать файл в любом месте, где у вашего приложения есть доступ для записи. Например, если вы хотите сохранить файл на SDCard. Создание экземпляра файла не создает его в файловой системе, если только вы не начнете запись в него (например, с помощью FileOutputStream)

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

person Greg    schedule 18.04.2012

То, что я прочитал на страницах Android, я вижу, что он создает файл с таким именем:

Конструктор файлов

Я думаю, что он записывает его в каталог /data/data/packagname

изменить: «имя пакета» не было показано в тексте выше. Я поставил его между скобками. :с

person Boy    schedule 18.04.2012
comment
отредактировал его. каталог packagename для текущего приложения - person Boy; 18.04.2012

Попробуйте сохранить в /sdcard/example.xml.

person Mainank Brahmbhatt    schedule 18.04.2012