2013-08-09 3 views
2

Я хотел бы написать кусок java, который добавляет заголовок и нижний колонтитул к входному потоку.java inputstream (добавить заголовок и нижний колонтитул)

public static InputStream enrichInputStream(InputStream is, 
              String header, 
              String footer) { 
    ... 
} 

Представьте, что вы едите InputStream, из которого вы получили бы: "Вот некоторые данные"

тогда, если я называл

enrich(is,"my-header","my-footer") 

Я хотел бы получить

my-headerHERE IS SOME DATAmy-footer 

это выполнимо? Может кто-нибудь набросать решение?

p.s. Примечание: входной поток может быть очень большим, поэтому это нехорошее решение для объединения заголовка + содержимого исходного нижнего колонтитула InputStream + ...

+0

насколько велик ваш входной поток примерно? – Bohemian

+0

@Bohemian Хорошая точка. Это массивный !!! – Zo72

+0

Слишком большой, чтобы хранить в памяти? Это больше, чем несколько Мб? – Bohemian

ответ

3

Как насчет SequenceInputStream к совместному вашему заголовку, телу и колонтитул вместе

Смотрите здесь:.. how-to-chain-multiple-different-inputstreams-into-one-inputstream

+0

Olschewsky Это звучит элегантное решение ... позвольте мне заглянуть в – Zo72

+0

Это было блестяще, я реализовал в 5 строках ... – Zo72

+0

@ Zo72 в принципе «компилирует заголовок + содержимое исходного InputStream + footer», который вам никогда не нужен? –

1

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

Вам необходимо создать отфильтрованный поток путем расширения FilterInputStream или для вывода FilterOutputStream.

Вы можете затем переопределить методы, такие как read(, чтобы сначала прочитать заголовок.

Для вывода это несколько проще. Просто напишите заголовок при открытии потока и переопределите close(, чтобы написать нижний колонтитул перед закрытием.

2

Эскиз решения в соответствии с запросом на вопрос: Создайте свой собственный класс EnrichedInputStream, наследующий от InputStream.

  1. Помните верхний колонтитул, и исходный поток в вызове конструктора, который имеет эти три параметра.
  2. Имейте одну или несколько переменных экземпляра, отображающих состояние (позиция в заголовке, в исходном потоке, в нижнем колонтитуле).
  3. Owerwrite функция чтения, чтобы сначала доставить заголовок, после его окончания, передать содержимое z исходного потока после . его конец доставить колонтитул Это будет использовать указанные выше переменного экземпляр
+0

@FrankPI, это справедливо ... но это кажется довольно сложным ... Интересно, есть ли что-то более простое? – Zo72

+0

+1 Я думаю, что это просто, красиво простой в применении и легкий – Bohemian

+0

Это было бы менее пятидесяти строк кода, я бы предположил. Но проще, что, я не думаю, что это возможно на Java. – FrankPl

Смежные вопросы