2011-12-08 52 views
2

我必須使用SAX從Jetty緩衝區的內容解析xml。 從我ContentExchange我可以打電話getRequestContent,然後我得到一個Buffer將Jetty Buffer轉換爲InputStream

我需要一個InputStream,或InputSoruceStringFile,以便與SAX解析它。我如何將緩衝區轉換爲其中的一種,哪種方式最有效?

它看起來很明顯,但我在文檔中找不到任何信息。

+0

你能調用'new ByteArrayInputStream(buffer.array())'嗎? '緩衝區'有一個數組方法我相信:http://jetty.codehaus.org/jetty/jetty-6/apidocs/org/mortbay/io/Buffer.html#array() – Gray

+0

這將是內存消耗。 – belgther

回答

1

對於回答一個老問題的道歉,但有人(比如我)可能會在未來偶然發現。

Jetty的Buffer類實現了writeTo(OutputStream)方法。一個簡單的解決辦法是做到以下幾點:

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

然後對於每個Buffer接受,這樣做:

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

這樣你就可以流無需反應用於緩存它們。

編輯:

當然,確保processBuffer()PipedInputStream的讀者在單獨的線程中運行,以避免潛在的死鎖。

0

也許你可以在自定義(匿名?)InputStream中包裝緩衝區,因爲你只需要實現read()方法。例如:

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

從碼頭文檔很難知道何時Buffer#get() method打結束,但一些簡單的測試應該顯示會發生什麼(如果它恰好返回-1那麼這個例子是完整的!)。

相關問題