我必须使用SAX
从Jetty缓冲区的内容中解析xml。
从我的ContentExchange
我可以致电getRequestContent
,然后我得到Buffer
我需要InputStream
或InputSoruce
或String
或File
才能使用SAX
解析它。如何将缓冲区转换为其中之一,哪种方式最有效?
看起来很明显,但我在文档中找不到任何信息。
答案 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
那么这个例子就完成了!)。