草庐IT

$ByteBuffer

全部标签

java - 通过 ByteBuffer 和 CQL 3 将 Java 对象序列化到 Cassandra 1.2

我将下面的代码拼凑在一起,没有做任何复杂的事情——只是创建一个byte[]变量,将它写入Cassandra中的一个blob字段(v1.2,通过新的DatastaxCQL库),然后再次读回。当我放入它时它有3个元素长,而当我读回它时它有84个元素长...!这意味着我实际尝试做的事情(序列化Java对象)在尝试时失败并出现org.apache.commons.lang.SerializationException:java.io.StreamCorruptedException:invalidstreamheader:81000008错误再次反序列化。下面是一些演示我的问题的示例代码:im

java - 从 JNI 操作 ByteBuffer

我需要将(直接)ByteBuffer传递给将从缓冲区读取/写入缓冲区的native函数。完成这些操作后,我想使用常规函数从Java代码访问ByteBuffer;特别是,limit()和position()应该反射(reflect)缓冲区的当前状态。由于JNI将使用GetDirectBufferAddress()直接访问底层缓冲区,我假设我应该调用flip()/limit()/position()在我完成读/写之后。但是,我一直无法完成这项工作。例如,当我从C中读取几个字节到缓冲区中,并相应地设置其限制和位置后,我无法从Java中查询这些字节;Java的缓冲区限制和位置的想法与我在C代码

Java ByteBuffer 性能问题

在处理多个千兆字节的文件时,我注意到一些奇怪的事情:似乎使用文件channel从一个文件读取到一个用allocateDirect分配的重复使用的ByteBuffer对象比从MappedByteBuffer读取慢得多,事实上它甚至比读取更慢使用常规读取调用转换为字节数组!我期望它(几乎)与从映射字节缓冲区读取一样快,因为我的ByteBuffer是使用allocateDirect分配的,因此读取应该直接在我的字节缓冲区中结束,没有任何中间副本。我现在的问题是:我做错了什么?还是bytebuffer+filechannel真的比普通的io/mmap慢?在下面的示例代码中,我还添加了一些将读取

java - 确定 ByteBuffer 中的字节数

我有一个ByteBuffer最多可以容纳(4+size)bytes(也就是说,一个整数后跟大小个字符)。但是,写入ByteBuffer的字符数可能小于size。所以我想知道,有没有办法确定有多少字符被写入ByteBuffer而不仅仅是它的总大小?limit、position等似乎不是我所追求的。感谢您的帮助! 最佳答案 写入ByteBuffer后,可以使用position()方法找到写入的字节数。如果您随后flip()缓冲区,缓冲区中的字节数可以通过limit()或remaining()方法。如果您随后读取一些缓冲区,剩余的字节数可

java - 如何避免制作 ByteBuffer 的防御性副本?

我有一个将ByteBuffer作为构造函数参数的类。有没有办法避免制作防御性副本以确保缓冲区在此之后不会被修改?ByteBuffer.isReadOnly()不保证原始所有者不会修改缓冲区。更糟糕的是,似乎没有办法将ByteBuffer子类化。有什么想法吗? 最佳答案 正如您所说,唯一真正的方法是buf.asReadOnlyBuffer(),然后将其传递给构造函数。除了这个之外没有其他选择,尽管您可以将内容复制到一个新的ByteBuffer中,然后传递它。 关于java-如何避免制作By

java - 如何避免制作 ByteBuffer 的防御性副本?

我有一个将ByteBuffer作为构造函数参数的类。有没有办法避免制作防御性副本以确保缓冲区在此之后不会被修改?ByteBuffer.isReadOnly()不保证原始所有者不会修改缓冲区。更糟糕的是,似乎没有办法将ByteBuffer子类化。有什么想法吗? 最佳答案 正如您所说,唯一真正的方法是buf.asReadOnlyBuffer(),然后将其传递给构造函数。除了这个之外没有其他选择,尽管您可以将内容复制到一个新的ByteBuffer中,然后传递它。 关于java-如何避免制作By

java - ByteBuffer Little Endian 插入不起作用

我必须在旧系统和安卓设备之间进行双向通信。遗留系统使用小端字节序。我已经成功实现了接收部分,但是发送不起作用。奇怪,因为对我来说ByteBuffer类似乎出现故障(我简直不敢相信)ByteBufferbyteBuffer=ByteBuffer.allocate(4);byteBuffer.order(ByteOrder.LITTLE_ENDIAN);byteBuffer=ByteBuffer.allocate(4);byteBuffer.putInt(88);byte[]result=byteBuffer.array();结果:[0,0,0,88]ByteBufferbyteBuffe

java - ByteBuffer Little Endian 插入不起作用

我必须在旧系统和安卓设备之间进行双向通信。遗留系统使用小端字节序。我已经成功实现了接收部分,但是发送不起作用。奇怪,因为对我来说ByteBuffer类似乎出现故障(我简直不敢相信)ByteBufferbyteBuffer=ByteBuffer.allocate(4);byteBuffer.order(ByteOrder.LITTLE_ENDIAN);byteBuffer=ByteBuffer.allocate(4);byteBuffer.putInt(88);byte[]result=byteBuffer.array();结果:[0,0,0,88]ByteBufferbyteBuffe

java - bytebuffer.flip() 和 bytebuffer.rewind() 的区别

我知道flip()将当前缓冲区位置设置为0,并将限制设置为上一个缓冲区位置,而rewind()只是将当前缓冲区位置设置为0。在下面的代码中,我使用rewind()或flip()得到相同的结果。byteb=127;bb.put(b);bb.rewind();//orflip();System.out.println(bb.get());bb.rewind();//orflip();System.out.println(bb.get());您能否提供一个真实的例子,说明这两种方法的区别真的很重要?提前致谢。 最佳答案 从源代码来看,它们

java - bytebuffer.flip() 和 bytebuffer.rewind() 的区别

我知道flip()将当前缓冲区位置设置为0,并将限制设置为上一个缓冲区位置,而rewind()只是将当前缓冲区位置设置为0。在下面的代码中,我使用rewind()或flip()得到相同的结果。byteb=127;bb.put(b);bb.rewind();//orflip();System.out.println(bb.get());bb.rewind();//orflip();System.out.println(bb.get());您能否提供一个真实的例子,说明这两种方法的区别真的很重要?提前致谢。 最佳答案 从源代码来看,它们