Конвертировать Jetty Buffer в InputStream - PullRequest
2 голосов
/ 08 декабря 2011

Я должен проанализировать xml из содержимого буфера Jetty, используя SAX. С моего ContentExchange я могу позвонить getRequestContent, и тогда я получу Buffer

Мне нужно InputStream, или InputSoruce, или String, или File, чтобы разобрать его с SAX. Как я могу преобразовать буфер в один из них, и какой способ наиболее эффективен?

Это выглядит как-то очевидно, но я не могу найти никакой информации в документации.

Ответы [ 2 ]

1 голос
/ 19 сентября 2012

Извиняюсь за ответ на старый вопрос, но кто-то (например, я) может наткнуться на это в будущем.

Класс Jetty Buffer реализует метод writeTo(OutputStream). Простым решением было бы сделать следующее:

PipedInputStream is = new PipedInputStream();
PipedOutputStream os = new PipedOutputStream(is);

Затем для каждого Buffer сделайте:

void processBuffer(Buffer buf) {
    buf.writeTo(os);
}

Таким образом, вы можете передавать ответы без необходимости их кэширования.

EDIT:

Конечно, убедитесь, что processBuffer() и читатели PipedInputStream работают в отдельных потоках, чтобы избежать потенциальной тупика.

0 голосов
/ 08 декабря 2011

Возможно, вы могли бы обернуть буфер в свой собственный (анонимный?) InputStream, поскольку вам нужно только реализовать метод read(). Например:

public InputStream forBuffer(final Buffer buf) {
  return new InputStream() {
    @Override
    public int read() /* throws IOException */ {
      return buf.get();
    }
  };
}

Из документации Jetty трудно сказать, что происходит, когда Buffer#get() метод достигает конца, но какое-то простое тестирование должно выявить это (и если оно возвращает -1, тогда этот пример завершен !).

...