Попытка загрузить кусками - PullRequest
1 голос
/ 08 мая 2011

Я пытаюсь выполнить загрузку большого файла на ежевике.Я успешно могу загрузить файл, но только если я читаю файл и загружаю его по 1 байту за раз.Для больших файлов я думаю, что это снижает производительность.Я хочу иметь возможность читать и писать на что-то более 128 кб одновременно.Если я попытаюсь инициализировать свой буфер чем-либо, кроме 1, я никогда не получу ответ от сервера после записи всего.

Есть идеи, почему я могу загружать, используя только 1 байт за раз?

z.write(boundaryMessage.toString().getBytes());
DataInputStream fileIn = fc.openDataInputStream();
boolean isCancel = false;

byte[]b = new byte[1];
int num = 0;
int left = buffer;

while((fileIn.read(b)>-1))
{
  num += b.length;
  left = buffer - num * 1;
  Log.info(num + "WRITTEN");

  if (isCancel == true)
  {
    break;
  }

  z.write(b);
}
z.write(endBoundary.toString().getBytes());

Ответы [ 3 ]

1 голос
/ 08 мая 2011

Это ошибка в ОС BlackBerry, которая появилась в OS 5.0 и сохраняется в OS 6.0.Если вы попытаетесь использовать многобайтовое чтение до OS 5, оно будет работать нормально.OS5 и позже производят поведение, которое вы описали.

Вы также можете обойти проблему, создав безопасное соединение, поскольку ошибка не проявляется для безопасных сокетов, только для простых сокетов.

0 голосов
/ 08 мая 2011

Большинство входных потоков не гарантируют заполнение буфера при каждом чтении. (DataInputStream имеет специальный метод для этого, readFully () , который будет выбрасывать EOFException, если в потоке осталось недостаточно байтов для заполнения буфера.) И если файл не является кратное длине буфера, ни один поток не заполнит буфер при окончательном чтении. Итак, вам нужно сохранить количество прочитанных байтов и использовать его во время записи:

while(!isCancel)
{
  int n = fileIn.read(b);
  if (n < 0)
    break;
  num += n;
  Log.info(num + "WRITTEN");
  z.write(b, 0, n);
}
0 голосов
/ 08 мая 2011

Ваш цикл не верен. Вы должны позаботиться о возвращаемом значении из прочитанного. Он возвращает количество байтов, которые были фактически прочитаны, и это не всегда совпадает с размером буфера.

Edit: Вот как вы обычно пишете циклы, которые делают то, что вы хотите сделать:

OutputStream z = null;  //Shouldn't be null
InputStream in = null;  //Shouldn't be null
byte[] buffer = new byte[1024 * 32];
int len = 0;
while ((len = in.read(buffer)) > -1) {
    z.write(buffer, 0, len);
}

Обратите внимание, что вы можете использовать буферизованные потоки вместо небуферизованных.

...