我必須使用SAX
從Jetty緩衝區的內容解析xml。 從我ContentExchange
我可以打電話getRequestContent
,然後我得到一個Buffer
將Jetty Buffer轉換爲InputStream
我需要一個InputStream
,或InputSoruce
或String
或File
,以便與SAX
解析它。我如何將緩衝區轉換爲其中的一種,哪種方式最有效?
它看起來很明顯,但我在文檔中找不到任何信息。
我必須使用SAX
從Jetty緩衝區的內容解析xml。 從我ContentExchange
我可以打電話getRequestContent
,然後我得到一個Buffer
將Jetty Buffer轉換爲InputStream
我需要一個InputStream
,或InputSoruce
或String
或File
,以便與SAX
解析它。我如何將緩衝區轉換爲其中的一種,哪種方式最有效?
它看起來很明顯,但我在文檔中找不到任何信息。
對於回答一個老問題的道歉,但有人(比如我)可能會在未來偶然發現。
Jetty的Buffer
類實現了writeTo(OutputStream)
方法。一個簡單的解決辦法是做到以下幾點:
PipedInputStream is = new PipedInputStream();
PipedOutputStream os = new PipedOutputStream(is);
然後對於每個Buffer
接受,這樣做:
void processBuffer(Buffer buf) {
buf.writeTo(os);
}
這樣你就可以流無需反應用於緩存它們。
編輯:
當然,確保processBuffer()
和PipedInputStream
的讀者在單獨的線程中運行,以避免潛在的死鎖。
也許你可以在自定義(匿名?)InputStream
中包裝緩衝區,因爲你只需要實現read()
方法。例如:
public InputStream forBuffer(final Buffer buf) {
return new InputStream() {
@Override
public int read() /* throws IOException */ {
return buf.get();
}
};
}
從碼頭文檔很難知道何時Buffer#get()
method打結束,但一些簡單的測試應該顯示會發生什麼(如果它恰好返回-1
那麼這個例子是完整的!)。
你能調用'new ByteArrayInputStream(buffer.array())'嗎? '緩衝區'有一個數組方法我相信:http://jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/io/Buffer.html#array() – Gray
這將是內存消耗。 – belgther