java - 如何在 Java 中将 ByteBuffer 转换为 long[]

标签 java nio

有人可以告诉我如何将 ByteBuffer 转换为 long[] 吗?

我首先有一个 long[],我使用以下代码将其转换为 ByteBuffer:


byte[] convertToByteArray(long[] data) {
    ByteBuffer byteBuffer = ByteBuffer.allocate(data.length * 8);;
    LongBuffer longBuffer = byteBuffer.asLongBuffer();
    longBuffer.put(data);
    return byteBuffer.array();
}

我现在想做相反的事情,并编写一些测试来比较转换前后的各种数组。

我尝试了以下操作,但在 JDK 1.6.0_26 上失败并出现 NPE:


long[] convertToLongArray(byte[] bArray) {
    ByteBuffer byteBuffer = ByteBuffer.wrap(bArray);
    LongBuffer longBuffer = byteBuffer.asLongBuffer();
    return longBuffer.array();
}

问候, 肉山

最佳答案

在我这边它抛出

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.nio.LongBuffer.array(LongBuffer.java:994)
    at test.convertToLongArray(test.java:11)
    at test.main(test.java:15)

这样做是因为 byteBuffer.asLongBuffer() 调用返回的实例是 ByteBufferAsLongBufferLByteBufferAsLongBufferB 类(取决于印度) 。 这两个类都是 LongBuffer 的子类,并且在构造函数调用中调用 super 构造函数时不使用 long array 参数。

正如 @Kayaman 提到的,这些只是 ByteBuffer 中字节数组的 View 。

下面是从 ByteBufferAsLongBufferL 构造函数调用的 super 构造函数。请注意 null 参数。

LongBuffer(int mark, int pos, int lim, int cap) { // package-private
    this(mark, pos, lim, cap, null, 0);
}

最好的选择是这样做:

long[] convertToLongArray(byte[] bArray) {
    ByteBuffer byteBuffer = ByteBuffer.wrap(bArray);
    LongBuffer longBuffer = byteBuffer.asLongBuffer();
    long l[] = new long[longBuffer.capacity()];
    longBuffer.get(l);
    return l;
}

关于java - 如何在 Java 中将 ByteBuffer 转换为 long[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19003231/

相关文章:

java - 在 Web 应用程序中显示 Excel 工作表 - Java EE

java - 为什么Java nio消耗CPU过多?

Java 7 nio FileAttributes 窗口

java - 为什么我的插入方法在创建堆时给出了 java.lang.StackOverflowError。

java - 查询 FileSystems.getPath(URI)

java - 是否有更优雅的方法从 ByteBuffer 读取四个字节并将每个字节视为一个字符

java - UnresolvedAddressException 套接字 channel

java - 如何在 Spring JPA 中更新 EmbeddedID 的字段

java - Spring Rest 重复检查在同时运行 100 个用户的服务时跳过一些时间

java - 在 json 中解析尾随字符