当前位置:首页 » 编程语言 » 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。

热点内容
安卓手机电影怎么投屏到ipad上 发布:2025-03-20 04:27:23 浏览:677
苹果安卓基于什么开发 发布:2025-03-20 04:20:52 浏览:520
算法化是 发布:2025-03-20 03:48:20 浏览:771
拆二代访问 发布:2025-03-20 03:47:34 浏览:63
随机数排序c语言 发布:2025-03-20 03:35:31 浏览:498
当前页面脚本发生错误类型不匹配 发布:2025-03-20 03:26:47 浏览:993
strutsajax上传图片 发布:2025-03-20 03:25:03 浏览:386
手机在线缓存 发布:2025-03-20 03:21:06 浏览:46
ftp路径上传时间 发布:2025-03-20 03:13:42 浏览:104
电脑连接通讯服务器失败怎么回事 发布:2025-03-20 03:10:30 浏览:287