Чтение сериализованного объекта Java, который был разделен на два файла? - PullRequest
1 голос
/ 02 марта 2010

Я пишу приложение для Android. Одна из проблем заключается в том, что ваше приложение не может содержать файл, размер которого в несжатом виде превышает 1 МБ. У меня есть сериализованный объект, который я хочу загрузить, что составляет около 2 МБ. Я планировал разделить этот файл на два файла меньшего размера, а затем загрузить объект, объединив оба файла во время выполнения.

Однако я не могу понять, как использовать, например, InputStream и ObjectInputStream, чтобы указать, что я хочу читать данные из двух входных потоков. Как я могу это сделать?

Например, скажем, мой объект был разделен между файлами O1 и O2. Как я могу сказать «Загрузите объект, прочитав данные из O1, а затем из O2»?

Ответы [ 2 ]

3 голосов
/ 02 марта 2010

Как указал Том Хоутин в комментариях, вы должны иметь возможность использовать встроенный в Java класс SequenceInputStream для десериализации объекта, который разбит на несколько файлов. Этот подход также позволяет десериализовать объект, разбитый на любое количество файлов, поскольку конструктор SequenceInputStream принимает два объекта InputStream, один из которых может быть другим SequenceInputStream.

Я создал небольшой пример, который должен работать на Android, хотя я тестировал его только на настольной установке Java. Пример работает в предположении, что вы сериализовали объект типа Foo и разбили сериализованную версию между двумя именами файлов myobj.part1 и myobj.part2.

Пример довольно понятен, но если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать.

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.SequenceInputStream;

...

ObjectInputStream in = null;

try {
    in = new ObjectInputStream(
        new SequenceInputStream(
                new FileInputStream("myobj.part1"),
                new FileInputStream("myobj.part2")));

    Foo foo = (Foo) in.readObject();

    // Do something with the deserialized object...
    foo.doSomething();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (in != null) {
        try { 
            in.close();
        } catch (IOException e) { }
    }
}
1 голос
/ 02 марта 2010

ObjectInputStream просто принимает InputStream в своем конструкторе, поэтому задача состоит в том, чтобы реализовать конкретный подкласс InputStream, который читает два файла последовательно (а не один, как FileInputStream). По сути, ваш конкретный подкласс должен реализовать read(byte[]), делегировав первый, а затем (когда он исчерпан) второй из двух FileInputStream s, которые он содержит как атрибуты (передайте их в конструктор вашего конкретного подкласса).

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