将Jetty Buffer转换为InputStream

时间:2011-12-08 13:57:26

标签: java jetty inputstream

我必须使用SAX从Jetty缓冲区的内容中解析xml。 从我的ContentExchange我可以致电getRequestContent,然后我得到Buffer

我需要InputStreamInputSoruceStringFile才能使用SAX解析它。如何将缓冲区转换为其中之一,哪种方式最有效?

看起来很明显,但我在文档中找不到任何信息。

2 个答案:

答案 0 :(得分:1)

回答旧问题的道歉,但有人(比如我自己)可能在将来偶然发现这一点。

Jetty的Buffer类实现了writeTo(OutputStream)方法。一个简单的解决方案是执行以下操作:

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

然后,对于收到的每个Buffer,请执行:

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

这样您就可以在不需要缓存响应的情况下传输响应。

编辑:

当然,请确保processBuffer()PipedInputStream的读者在不同的线程中运行以避免潜在的死锁。

答案 1 :(得分:0)

也许您可以将缓冲区包装在您自己的自定义(匿名?)InputStream中,因为您只需要实现read()方法。例如:

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

从Jetty文档中很难说出当Buffer#get() method到达终点时会发生什么,但是一些简单的测试应该揭示它(如果它恰好返回-1那么这个例子就完成了!)。