當前位置:首頁 » 編程語言 » javabytebuffer

javabytebuffer

發布時間: 2023-08-12 08:35:39

『壹』 java怎麼把bytebuffer反序列化

public static Object getObject(ByteBuffer byteBuffer) throws ClassNotFoundException, IOException {
// 需要mina框架的IoBuffer
IoBuffer buffer = IoBuffer.allocate(byteBuffer.capacity()).setAutoExpand(true); // 自動展開
for (int i = 0; i < byteBuffer.capacity(); i++) {
byteBuffer.position(i);
buffer.put(byteBuffer.get());
}
buffer.position(0);
InputStream input = buffer.asInputStream();
ObjectInputStream oi = new ObjectInputStream(input);
Object obj = oi.readObject();
input.close();
oi.close();
return obj;
}

『貳』 java nio bytebuffer文件讀寫問題

JDK1.4以後就提供java.nio的包,nio主要提供位元組與字元的映射、內存映射文件和文件加鎖機制
其中內存映射文件在讀取大文件時可能會用上,因為內存映射不是直接把文件載入到JVM內存空間
而是借用操作系統對文件的讀取,這經歷了由當前Java態進入到操作系統內核態,再由操作系統讀取文件,
並返回數據到當前Java態的過程。由Java態進入操作系統內核態離不開nio包中兩個重要的類
FileChannel 和 ByteBuffer。FileChannel表示文件通道,可以從FileInputStream、FileOutputStream
以及RandomAccessFile對象獲取文件通道,你可以從文件通道直接讀取文件,也可以使用「內存映射」
即使用通道,將文件內存映射到ByteBuffer,可以映射一部分內容,也可以映射全部內容,使用內存映射
能大幅提高我們操作大文件的速度

FileChannel 和 ByteBuffer文件讀取

[java] view plain
package nio;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;

/**
*
* Channel類似與流,數據可以從Channel讀取到Buffer,也可以從Buffer寫入到Channel
* 但通道和流還是有區別,比如流只能是單向讀或寫,而通道可以非同步讀寫
*
* @author yli
*/
public class FileChannelTest {

『叄』 如何引入java.nio.heapbytebuffer

heap buffer 和 direct buffer區別

在Java的NIO中,我們一般採用ByteBuffer緩沖區來傳輸數據,一般情況下我們創建Buffer對象是通過ByteBuffer的兩個靜態方法:

ByteBuffer.allocate(int capacity);
ByteBuffer.wrap(byte[] array);

查看JDK的NIO的源代碼關於這兩個部分:

/**allocate()函數的源碼**/
public static ByteBuffer allocate(int capacity) {
if (capacity < 0)
throw new IllegalArgumentException();
return new HeapByteBuffer(capacity, capacity);
}

/**wrap()函數的源碼**/
public static ByteBuffer wrap(byte[] array) {
return wrap(array, 0, array.length);
}
//
public static ByteBuffer wrap(byte[] array,
int offset, int length)
{
try {
return new HeapByteBuffer(array, offset, length);
} catch (IllegalArgumentException x) {
throw new IndexOutOfBoundsException();
}
}

我們可以很清楚的發現,這兩個方法都是實例化HeapByteBuffer來創建的ByteBuffer對象,也就是heap buffer. 其實除了heap buffer以外還有一種buffer,叫做direct buffer。我們也可以創建這一種buffer,通過ByteBuffer.allocateDirect(int capacity)方法,查看JDK源碼如下:

public static ByteBuffer allocateDirect(int capacity) {
return new DirectByteBuffer(capacity);
}

我們發現該函數調用的是DirectByteBuffer(capacity)這個類,這個類就是創建了direct buffer。

熱點內容
fsb文件解壓 發布:2025-03-20 12:31:34 瀏覽:135
3d源碼棋牌 發布:2025-03-20 12:30:31 瀏覽:237
什麼叫伺服器訪問限制 發布:2025-03-20 12:23:53 瀏覽:944
機架式伺服器如何拆裝 發布:2025-03-20 12:23:53 瀏覽:22
交叉編譯器缺少庫 發布:2025-03-20 12:20:12 瀏覽:716
tt語音新人簽到領皮膚腳本 發布:2025-03-20 12:20:05 瀏覽:693
編程招標網 發布:2025-03-20 12:19:28 瀏覽:1000
風險防控平台伺服器地址是什麼 發布:2025-03-20 11:59:04 瀏覽:231
什麼為有效wifi密碼 發布:2025-03-20 11:57:22 瀏覽:704
聯發科安卓哪個好 發布:2025-03-20 11:56:26 瀏覽:356