У меня есть ByteBuffer, называемый buffer. Я хочу создать новый буфер, содержащий все его байты, которые идут от buffer.position() до конца буфера, за которым следуют все байты из позиции 0 в buffer.position() - 1.
По сути, я хочу переместить байты в текущей позиции в начало буфера, доведя текущее начало до конца.
Чтобы проиллюстрировать, если это мой ByteBuffer (где P
- текущая позиция, а числа 0-9
указывают позиции байта):
|0123456789|
P
... тогда я хотел бы создать новый ByteBuffer, который выглядит так:
|3456789012|
P
Вот что я пытаюсь до сих пор (и не работает):
ByteBuffer tmpByteBuffer = buffer.slice();
tmpByteBuffer.limit(buffer.capacity());
И вот ошибка (это от LogCat на Android - хотя я не думаю, что проблема связана с Android):
12-22 03:49:44.303: ERROR/AndroidRuntime(10399): Uncaught handler: thread Thread-11 exiting due to uncaught exception
12-22 03:49:44.313: ERROR/AndroidRuntime(10399): java.lang.IllegalArgumentException
12-22 03:49:44.313: ERROR/AndroidRuntime(10399): at java.nio.Buffer.limit(Buffer.java:239)
12-22 03:49:44.313: ERROR/AndroidRuntime(10399): at com.chaimp.audiolistener.AudioListener.captureSamples(AudioListener.java:175)
12-22 03:49:44.313: ERROR/AndroidRuntime(10399): at com.chaimp.precisiontuner.PrecisionTuner$1.run(PrecisionTuner.java:28)
12-22 03:49:44.313: ERROR/AndroidRuntime(10399): at java.lang.Thread.run(Thread.java:1096)
Кто-нибудь может сказать мне, что я делаю неправильно?
И есть ли лучший способ сделать это?
Спасибо за помощь в этом.
Hm, я не понимаю, почему вам нужно установить ограничение на нарезанный буфер. Это должно работать:
ByteBuffer originalBuffer = getOriginalBuffer();
ByteBuffer newBuffer = ByteBuffer.allocate(originalBuffer.limit());
ByteBuffer slicedBuffer = originalBuffer.slice(); //Will be from pos to end
originalBuffer.flip(); //Will be from 0 to pos
newBuffer.put(slicedBuffer)
newBuffer.put(originalBuffer)