Один входной поток, содержащий два файла.Я хочу разделить эти файлы - PullRequest
1 голос
/ 14 марта 2011

В Java у меня есть inputstream (может быть sequenceinputstream), содержащий более одного файла.Я хочу отделить эти файлы с помощью Java.Есть ли какое-либо решение, доступное в Java?

Ответы [ 3 ]

0 голосов
/ 14 марта 2011

Это зависит от того, какие файлы у вас есть, если есть какая-либо зарезервированная последовательность, которая указывает конец и / или начало файла, например HTML или XML и т. Д., То вы можете разделить их, в противном случае я не вижу никакихспособ сделать это.

0 голосов
/ 19 октября 2011

У вас должен быть какой-то способ определить, где заканчивается один файл и начинается следующий - большинство файлов резервируют первые несколько байтов в качестве тега «identity».Помните, что настойчивость Java в отношении наличия байтового класса SIGNED может помешать их идентификации во время выполнения.

Однако вы не можете по-настоящему разделить потоки.Таким образом, вам придется размещать данные через обычные байтовые [] массивы.Я читал из родительского потока порциями по 4 КБ (для файлов) или 64 КБ (для сети), поскольку базовые нативные вызовы обычно используют эти размеры, сохраняли фрагменты в списках, а затем создавали ByteArrayInputStream для каждого файла в конце..

0 голосов
/ 14 марта 2011

Простой ответ: вы не можете / не должны.

Сложный ответ: если вы имеете дело с SequenceInputStream, вы можете получить доступ к базовым потокам, используя этот взлом отражения:

@SuppressWarnings("unchecked")
public static Enumeration<InputStream> split(final SequenceInputStream sis){
    try{
        Field streamsEnumField =
            SequenceInputStream.class.getDeclaredField("e");
        streamsEnumField.setAccessible(true);
        return (Enumeration<InputStream>) streamsEnumField.get(sis);
    } catch(final Exception e){
        throw new IllegalStateException(e);
    }
}

Но я бы был очень осторожен в использовании чего-то подобного.

...