2011-08-31 88 views

回答

2

呃,你的意思是像...

String foo = "My String"; 
ByteBuffer myBuffer = ByteBuffer.wrap(foo.getBytes()); 

編輯:對於int你可以做...

int i = 1234; 
ByteBuffer b = ByteBuffer.allocate(4); 
b.putInt(i); 
+0

所以這將採取'foo'並將其轉換爲字節並將其放入'ByteBuffer'?這正是我正在尋找的。 – darksky

+0

正確。 'wrap'是'ByteBuffer'中的一個靜態方法,它將一個字節數組作爲參數,並返回一個新的'ByteBuffer'。 ''''''getBytes()'方法返回一個字節數組。 –

+0

雖然你如何對int進行同樣的操作? – darksky

1

嗯,你可以,如果他們實現serializable序列化你的對象並且如果你真的想將序列化的字節存儲在ByteBuffer中。

ByteBuffer的主要目的似乎是緩衝字節,以便異步傳輸可以加快。

它似乎是你正在考慮獲取對象所在的RAM塊並將該塊放入ByteBuffer中。這不起作用。我的意思是,你可以做到這一點,但祝你好運,讓對象回到可用狀態。你必須對它做些工作,比如把指針變成有意義的新地址(指的是存儲對象的實際字段的地方或什麼)。這是序列化,這就是serializable所做的。

+0

謝謝..但是我試圖使用「serializable」以外的內容。 – darksky

3

正如你可能知道的那樣,在計算機編程中,大部分數據以某種方式存儲在較低級別的字節格式中。

字節緩衝區=方便的讀/「所有」數據類型/從一個字節表示的寫:

ByteBuffer是一個很方便的類,以字節轉換從類型「像詮釋」以字節表示。但也是相反的。您可以使用讀取方法從字節表示中讀取「類型」。

關於你的問題:有一個通用的put方法接受一個字節。但也有很多方便的方法把和讀取大部分標準數據類型,也INT(爲你問):

http://download.oracle.com/javase/1,5.0/docs/api/java/nio/ByteBuffer.html#putInt(int

ByteBuffer byteBuffer = ByteBuffer.allocate(4); 
byteBuffer.putInt(4); 
byteBuffer.get() => gets the byte representation of the Int you put in 

實際使用案例:

要誠實,對我而言,使用最重的ByteBuffer與Cassandra NoSQL DB是一致的。它們將所有數據存儲爲字節(數組),並且ByteBuffer是一個方便的類,可幫助您讀取和寫入這些數據。

高端應用:

正如你所看到的類是在NIO包。我認爲ByteBuffer的起源是非常有效地將數據寫入磁盤。它不會將它寫入內存之前,而是直接將磁盤上「塊」的區域映射到java中的緩衝區。所以它避免了讀取和寫入數據到磁盤的任何中間步驟。但這是非常高的使用...

+0

這將如何工作: 'ByteBuffer byteBuffer = ByteBuffer.allocate(2); byteBuffer.putInt(4);' 一個int需要4個字節,你只是分配2個字節。 – darksky

+0

謝謝,你的答案是正確的,考慮到錯誤的數據類型,修復它 – Markus

相關問題