Когда вы заполняете src
8 КБ данных, позиция размером 8 КБ в буфер размером 20000.
Затем вы вызываете src.get(b, 0, b.length)
, который покорно копирует данные размером 8 КБ (потому что b.length = 8kb) в массив b ... , начиная с текущей позиции, которая составляет 8kb в . Итак, он копирует байты [8192,16384) в ваш массив байтов. Которые, конечно же, все нули.
Итак, как вы это исправить?
Это именно то, для чего предназначен метод flip()
буферов: для перехода из режима 'записи' в режим «читать». После того, как sr c набрал 8 КБ данных, переверните ваш буфер (в этот момент position () равен 0, а limit () теперь соответствует позиции, т.е. 8kb), тогда это будет отлично работать.
Затем, чтобы вернуться в начальный режим (готовность к записи до 20000 в буфер), очистите его.
Это поток для буферов:
- Вы начинаете с position = 0, limit = 20000.
- Вы читаете некоторый объем данных (в данном случае 8192) в буфер. В какой-то момент pos = 8192, limit = 20000.
- вы переворачиваете: pos теперь 0, limit = 8192, capacity = 20000.
- Вы читаете все 8192 во что-то другое; pos теперь 8192, limit 8192, cap 20000.
- вы очищаете pos теперь 0, емкость 20000, как и предел.
- go снова в начало. Вы можете делать это бесконечно.
так, записывать в буфер, переворачивать, читать из него, очищать, писать в него, переворачивать, читать из него, очищать - навсегда.
EDIT : Я ошибочно думал, что flip () также переведет вас из «режима чтения» обратно в режим записи. На самом деле это не так, яснее лучше, обновил ответ, чтобы отразить это.