javabytebuffer
『壹』 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。