Java 从ByteBuffer创建DataBufferUShort

Java 从ByteBuffer创建DataBufferUShort,java,awt,nio,Java,Awt,Nio,(Oracle Java 1.7、Eclipse开普勒、Ubuntu 12.04 64位) 我需要从ByteBuffer创建DataBufferUShort,但我所有的尝试在运行时都失败了 这是怎么做到的,先生 这里有一个失败:(java.lang.UnsupportedOperationException) 这是堆栈跟踪。第156行是上面代码段中的第二行 Exception in thread "main" java.lang.UnsupportedOperationException at

(Oracle Java 1.7、Eclipse开普勒、Ubuntu 12.04 64位)

我需要从ByteBuffer创建DataBufferUShort,但我所有的尝试在运行时都失败了

这是怎么做到的,先生

这里有一个失败:(java.lang.UnsupportedOperationException)

这是堆栈跟踪。第156行是上面代码段中的第二行

 Exception in thread "main" java.lang.UnsupportedOperationException
at java.nio.ShortBuffer.array(ShortBuffer.java:959)
at psw.iu.CreateImage.createGrayscaleImage(CreateImage.java:156)
at psw.iu.TestCreateImage.<init>(TestCreateImage.java:48)
at psw.iu.TestCreateImage.main(TestCreateImage.java:16)
如果原始ShortBuffer是使用
short[]
创建的,则ShortBuffer.array()方法将仅返回数组。在您的例子中,您的ShortBuffer实际上是构建在一个
字节[]
(由ByteBuffer持有)之上的,因此这不起作用

如果确实需要短[],则需要将短缓冲区的内容复制到短[]。比如:

short[] shorts = new short[sBuf.remaining()];
sBuff.get(shorts);

您正在创建的ShortBuffer只是ByteBuffer的一个视图,视图缓冲区不支持array()。您需要使用ShortBuffer.allocate()创建一个“真实”的ShortBuffer,并通过ByteBuffer的sbuff.get()将数据复制到其中(首先翻转后者).

介意包括您迄今为止尝试过的运行时失败代码的代表性示例吗?@MattBall是一个足够错误的示例吗?不。发布堆栈跟踪。@MattBall我添加了跟踪。您如何创建
imageData
?@NateLockwood-您不能得到“相同的错误”。您不应该再调用
array()
方法,而应该传入刚刚创建的
shorts
数组。
    public static ByteBuffer createScaledData(WorkingByteBuffer rawWBB,
        ByteBuffer scaledByteBuffer) {

    rawWBB.byteBuffer.rewind(); // byteBuffer is a ByteBuffer
    scaledByteBuffer.rewind();
    ShortBuffer inBuf = rawWBB.byteBuffer.asShortBuffer();
    ShortBuffer outBuf = scaledByteBuffer.asShortBuffer();
    inBuf.rewind();
    outBuf.rewind();
    int maxDN = MAX_USHORT;
    double scaleFactor = (double) maxDN / (double) range;

    while (inBuf.hasRemaining()) {
        int value = 0xffff & inBuf.get();
        int scaledValue = (int) ((double) (value - min) * scaleFactor + 0.5);
        if (scaledValue < 0)
            scaledValue = 0;
        if (scaledValue > maxDN)
            scaledValue = maxDN;
        outBuf.put((short) scaledValue);
    }

    return scaledByteBuffer;

}
        imageData.rewind();
    ShortBuffer shortBuffer = imageData.asShortBuffer();
    shortBuffer.rewind();
    DataBufferUShort dataBufferUShort = new DataBufferUShort( nLines * nPixPerLine);
    int index = 0;
    while(shortBuffer.hasRemaining()){
        dataBufferUShort.setElem(index++, 0xffff & shortBuffer.get());
    }
short[] shorts = new short[sBuf.remaining()];
sBuff.get(shorts);