1

我使用了非常有用的 ByteArrayOutputStream,但对于我的需要来说,限制太大了(即我正在处理 +-32,768 范围内的数字)

这是我将使用它的代码:

ByteArrayOutputStream leftStream = new ByteArrayOutputStream();
ByteArrayOutputStream rightStream = new ByteArrayOutputStream();

while (din.read(temp, 0, 4) != -1) {
    if (decodedFormat.getChannels() == 2) {
       leftStream.write(temp[1] * 256 + temp[0]);
       rightStream.write(temp[3] * 256 + temp[2]);
    }
}

byte[] left = leftStream.toByteArray();
byte[] right = rightStream.toByteArray();

但是 ByteArrayInputStream 不允许超过 127 或低于 128 的值。是否有等效的 ShortArrayOutputStream 允许短裤?还是我必须以某种方式自己制作一个?

4

4 回答 4

3

是的,使用 DataOutputStream:

ByteArrayOuputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);

dos.writeShort(val);

这甚至适用于具有低 Java 版本 1.3 的嵌入式 Java 设备

在使用中阅读:

ByteArrayInputStreamDataInputStreamdis, 和dis.readShort():

...
byte[] bytes = bos.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
DataInputStream dis = new DataInputStream(bis);
short val = dis.readShort();
于 2014-03-19T20:14:44.250 回答
1

你想让我做什么?

将短数据写入字节数组?

然后用 DataOutputStream 包装您的字节数组输出流,该流具有 writeShort()、writeInt() 等方法。警告。我认为 DataOutputStream 的字节序是大字节序,所以如果你想使用小字节序,你要么自己写,要么使用其他选项:

ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
DataOutputStream dataout = new DataOutputStream(byteOut)

dataout.writeShort(shortValue);

写一个简短的[]

最简单的就是创建一个ByteBuffer,然后用asShortBuffer()方法把它看成一个ShortBuffer。ShortBuffer 有一个put(short)和 put(short[]);

如果你想用 Little endian 写出短数据,ByteBuffer 有一个方法asOrder(ByteOrder)可以改变它正在读取或写入的数据的 endian。

//NOTE length should be 2* num shorts since we allocate in bytes
ByteBuffer buf = ByteBuffer.allocate(length);

ShortBuffer shortBuf = buf.asShortBuffer();
shortBuf.put(shortValue);
shortBuf.put(shortArray);

从缓冲区中取出数据很烦人。有可选array()方法,但并非所有缓冲区执行都支持它们,因此您必须执行以下操作:

//once all data written to buffer
shortBuf.flip();
short[] dataOut = new short[shortBuf.remaining()];
shortBuf.get(dataOut);

两者结合以在未知输入大小上使用 ShortBuffer

如果您不知道要写入多少字节,并且没有合理的最大长度,那么您可能需要结合使用这两个选项。首先,使用选项#1 通过向字节缓冲区写入短裤来动态增长字节缓冲区。然后使用 ShortBuffer 将 byte[] 转换为 short[]。

 ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
DataOutputStream dataout = new DataOutputStream(byteOut)

dataout.writeShort(shortValue);
...

ShortBuffer buf =ByteBuffer.wrap(byteOut.toByteArray())
                           .asShortBuffer();

int length = buf.remaining();
short[] asShorts = new short[length];
buf.get(asShorts);

由于您制作了数组的副本,因此它并不漂亮并且使用了 2 倍的内存。

于 2014-03-19T20:12:18.317 回答
1

您可以包装ByteArrayOutputStreamDataOutputStream

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);

dataOutputStream.writeShort(someShortValue);
于 2014-03-19T20:13:34.430 回答
-1

创建一个对象输出流。这有一个 writeShort ( http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html#writeShort(int) ) 方法。

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeShort(123);
...
于 2014-03-19T20:09:52.313 回答