2012-11-20 78 views
0

我正在閱讀一個字節數組傳遞給我(不是我的選擇,但我必須這樣使用它)。我需要將數據獲取到LinkedBlockingQueue,並最終逐步構建一個或多個(可能包含部分消息)xml消息的字節。所以我的問題是這樣的:最有效的方法來獲取字節[]隊列(ListBlockingQueue)

我應該使用什麼類型的LBQ類型? 什麼是最有效的方法來獲得該字節[]該泛型類型?

這裏是我的示例代碼:

parsebytes(byte[] bytes, int length) 
{ 
    //assume that i am doing other checks on data 

    if (length > 0) 
    { 
     myThread.putBytes(bytes, length); 
    } 
} 
在我的線程

putBytes(byte[] bytes, int length) 
{ 
    for (int i = 0; i < length; i++) 
    { 
     blockingQueue.put(bytes[i]); 
    } 
} 

我也不想有拉斷阻塞隊列逐字節兩種。我寧願抓住隊列中的所有東西並處理它。

+2

有與使用(字節)的問題(http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Byte。 html)類型,並讓java自動轉換爲你(不確定性能效率,但代碼行可能是最簡單的)。 – zbrunson

+0

你有'byte []'或[ByteArrayInputStream](http://docs.oracle.com/javase/6/docs/api/java/io/ByteArrayInputStream.html)或其他嗎?當你獲得更多數據時,是否會給你'byte []'繼續更新它?如果對這些問題的答案是否定的,爲什麼你需要隊列被阻塞? – durron597

+0

函數參數是byte []。基本上我需要儘快退出該函數,因此我將數據關閉,並在另一個線程中使用LBQ上的put/take來處理它。 我目前有LBQ作爲一個字節,但它似乎是浪費,必須循環放入逐字節。 – Jason

回答

2

有沒有這樣的事情ListBlockingQueue。但是,任何BlockingQueue<Object>將接受byte[],因爲Java數組是對象。

在沒有其他設計考慮因素的情況下,最簡單的選擇可能是在數組到達時將數組插入隊列中,讓消費者將它們連接在一起。

+0

對不起,錯誤輸入。它是一個LinkedBlockingQueue。 – Jason

+0

這是問題的一部分。 對於定義: LinkedBlockingQueue blockingQueue = new LinkedBlockingQueue (); 你不能這樣做: blockingQueue.put(bytes); // where bytes == byte [] – Jason

+1

你能改變隊列到LinkedBlockingQueue 嗎?如果你這樣做,你可以直接將數組放入隊列中。 – NPE

3

考慮一下:

BlockingQueue<byte[]> q = new LinkedBlockingQueue<>(); 
    q.put(new byte[] {1,2,3}); 
    byte[] bytes = q.take(); 
+0

如果我們在隊列中放入不同大小的byte [],它會在q.take()上返回多少字節? – SohailAziz

+0

@SohailAziz - 使用'bytes.length'來檢查'q.take()'返回的byte []中有多少字節。 'BlockingQueue'將返回你放入它的同一個對象(本例中是一個'byte []'對象)。您可以通過詢問數組的'length'字段(即'bytes.length')來檢查字節數組中的字節數, – yegeniy

相關問題