Очень хорошо, что это может быть просто момент KISS, но я чувствую, что должен все равно спросить.
У меня есть поток, и он читает из сокетов InputStream.Поскольку я имею дело с особенно маленькими размерами данных (поскольку данные, от которых я могу ожидать получения порядка 100–200 байт), я установил размер буферного массива равным 256. Как часть моей функции чтения, у меня естьпроверьте, что при чтении из InputStream я получу все данные.Если я этого не сделаю, то я буду рекурсивно вызывать функцию чтения снова.Для каждого рекурсивного вызова я объединяю два буферных массива вместе.
Моя проблема в том, что, хотя я никогда не ожидаю использовать больше, чем буфер 256, я хочу быть в безопасности.Но если овцы начинают летать, и буфер становится значительно больше, функция чтения (по оценкам) начнет занимать экспоненциальную кривую больше времени для завершения.
Как я могу увеличить эффективность функции чтения и /или объединение буфера?
Вот функция чтения в том виде, в каком она есть.
int BUFFER_AMOUNT = 256;
private int read(byte[] buffer) throws IOException {
int bytes = mInStream.read(buffer); // Read the input stream
if (bytes == -1) { // If bytes == -1 then we didn't get all of the data
byte[] newBuffer = new byte[BUFFER_AMOUNT]; // Try to get the rest
int newBytes;
newBytes = read(newBuffer); // Recurse until we have all the data
byte[] oldBuffer = new byte[bytes + newBytes]; // make the final array size
// Merge buffer into the begining of old buffer.
// We do this so that once the method finishes, we can just add the
// modified buffer to a queue later in the class for processing.
for (int i = 0; i < bytes; i++)
oldBuffer[i] = buffer[i];
for (int i = bytes; i < bytes + newBytes; i++) // Merge newBuffer into the latter half of old Buffer
oldBuffer[i] = newBuffer[i];
// Used for the recursion
buffer = oldBuffer; // And now we set buffer to the new buffer full of all the data.
return bytes + newBytes;
}
return bytes;
}
РЕДАКТИРОВАТЬ: я параноик (неоправданно) и должен просто установить буфер на 2048 и вызвать его сделать?