Какая структура данных для чтения / хранения 500 объектов - PullRequest
0 голосов
/ 26 августа 2011

Когда мое приложение запускается, мне нужно загрузить около 500 объектов со страницы XML, например:

<object>
<name>objectname</name>
<info>info</info>
<info2>info</info2>
<info3>info</info3>
<info4>info</info4>
<alias>false</alias>
</object>

Теперь я хочу сохранить это на устройстве, надеясь, что чтение будет быстрее. В настоящее время я использую ObjectOutputStream для записи объектов.

private static void write(ArrayList<MyObject> objects, String fileName, Context context) {
        final File cacheDir = context.getCacheDir();
        final File objectsFile = new File(cacheDir.getAbsoluteFile() + File.separator + fileName);

        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        boolean keep = true;

        try {
            fos = new FileOutputStream(objectsFile);
            oos = new ObjectOutputStream(fos);

            oos.writeObject(objects);
        } catch (Exception e) {
            e.printStackTrace();
            keep = false;
        } finally {
            try {
                if (oos != null)
                    oos.close();
                if (fos != null)
                    fos.close();
                if (keep == false)
                    objectsFile.delete();
            } catch (Exception e) {
            }
        }
    }

Это не очень быстрое решение, чтение может занять около 10-15 секунд. Я показываю объекты в виде списка, поэтому все объекты необходимо прочитать сразу.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

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

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

0 голосов
/ 26 августа 2011

Я предполагаю, что вы не хотите анализировать XML при каждом запуске приложения. Я бы предложил использовать DataOutputStream и выполнить собственное кодирование / декодирование. Это будет намного быстрее, чем ObjectOutputStream. Вы можете запустить файл, записав количество объектов, так как это немного облегчит чтение.

private static void write(ArrayList<MyObject> objects /* , other args */ ) {
    // ...
    try {
        dos = new DataOutputStream(new FileOutputStream(objectsFile));
        dos.writeInt(objects.size());
        for (MyObject object : objects) {
            dos.writeUTF(object.info);
            dos.writeUTF(object.info2);
            dos.writeUTF(object.info3);
            dos.writeUTF(object.info4);
            dos.writeBoolean(object.alias);
        }
        dos.flush();
    } catch (Exception e) {
        e.printStackTrace();
        keep = false;
    } finally {
        try {
            if (dos != null)
                dos.close();
            if (keep == false)
                objectsFile.delete();
        } catch (Exception e) {
        }
    }
}

Для чтения просто следуйте тому же шаблону с DataInputStream:

ArrayList<MyObject> read( /* args */ ) {
    // ...
    ArrayList<MyObject> objects = new ArrayList<MyObject>();
    int n = dis.readInt();
    while (n-- > 0) {
        MyObject object = new MyObject();
        object.info = dis.readUTF();
        // etc.
        objects.add(object);
    }
    return objects;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...