#java #scala #memory
Вопрос:
Недавно я столкнулся с проблемой при использовании DirectByteBuffer в коде scala. Ниже приведен мой код.
def byteBuffer = ByteBuffer.allocateDirect(10 * 4)
for (i <- 0 until 10) {
println(s"Remaining: ${byteBuffer.remaining()}") // Always return 40
byteBuffer.putFloat(1) // Also tried byteBuffer.putFloat(i, 1) to try to put it to specific index, still nothing changed.
}
byteBuffer.position(0) // With or without this line, result doesn't change
for (i <- 0 until 40) {
println(s"At index=$i, get=${byteBuffer.get()}") // Always 0
println(byteBuffer.remaining()) // Always 40
}
Для всего цикла ByteBuffer.remaining() всегда возвращает 40, что, похоже, вызовы «put()» никогда не работали. В результате, содержимое при выполнении «get ()» содержимое буфера всегда равно 0.
Даже вызов get() вообще не перемещает индекс.
Задавался вопросом, почему он не пишет в директ-буфер?
При использовании HeapBuffer использование будет генерировать правильное поведение, только не DirectBuffer.
Ответ №1:
Ваш byteBuffer
определяется как def
, это метод: каждый раз, когда вы звоните byteBuffer
, вы получаете новый буфер.
Вы, наверное, хотите сменить его на a val
?
Комментарии:
1. Огромное вам спасибо, не могу поверить, что потратила на это столько времени. Это на самом деле спасло мне жизнь.