Я последовательно читаю блоки BLOCKSIZE (например, 512) байтов из SocketChannel в ByteBuffer. Затем я хотел бы добавить содержимое ByteBuffer к байту [] и перейти к следующему раунду. Результатом будет byte[], содержащий все байты, прочитанные из SocketChannel.
Теперь System.arraycopy(...) работает как положено. Но когда я использую get(result, offset, length) ByteBuffer, ничего не пишется. Значения результирующего массива остаются обнуленными.
Это почему?
public final static int BLOCKSIZE = 512;
public byte[] getReceivedData() {
int offset = 0, read;
byte[] result = {};
ByteBuffer buffer = ByteBuffer.allocate(BLOCKSIZE);
try {
while (true) {
read = _socketChannel.read(buffer);
if (read < 1) {
// Nothing was read.
break;
}
// Enlarge result so we can append the bytes we just read.
result = Arrays.copyOf(result, result.length + read);
// This works as expected.
System.arraycopy(buffer.array(), 0, result, offset * BLOCKSIZE, read);
// With this, however, nothing is written to result. Why?
buffer.get(result, offset * BLOCKSIZE, read);
if (read < BLOCKSIZE) {
// Nothing left to read from _socketChannel.
break;
}
buffer.clear();
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
ИЗМЕНИТЬ:
Я заметил, что offset++
тоже отсутствует. Поэтому, если на канале больше BLOCKSIZE
байт, все запутается...
В любом случае, ByteArrayOutputStream
действительно все упрощает, поэтому я решил использовать его.
Рабочий код:
public byte[] getReceivedData() {
int read;
ByteArrayOutputStream result = new ByteArrayOutputStream();
ByteBuffer buffer = ByteBuffer.allocate(BLOCKSIZE);
try {
while (true) {
buffer.clear();
read = _socketChannel.read(buffer);
if (read < 1) {
break;
}
result.write(buffer.array(), 0, read);
if (read < BLOCKSIZE) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return result.toByteArray();
}