Модераторы: javastic, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение файла из потока 
:(
    Опции темы
vandaler
Дата 27.11.2009, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 5.11.2009

Репутация: нет
Всего: нет



Задача - принять строку от сервера, в которой хранится файл, где 5 первых символов - длина строчки с самим файлом, а дальше файл.
Код

             int size = 0;
             for (i=0; i<5; i++)
             {
                size = size*10 + is.read() - 48;
             }             
             byte[] im = null;
             int c;
             i  = is.read(im, 0, size);

такой код виснет на последней строке. однако если считывать сообщение побайтно - все работает. помогите, в чем беда?
PM MAIL   Вверх
W0LF
Дата 28.11.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



ничего не понял, если честно, но проблема сокрее всего здесь - 
Код

size = size*10 + is.read() - 48;

мне кажется у тебя слишком большой size получается, и соответственно в потоке нет столько байт.
но это если виснет. а вообще по идее вылетать должно.
у тебя im должен быть инициализирован и под него уже должна быть выделена память, а он null, соответственно я бы твое зависание назвал ексепшином.
доки читать надо!
Цитата

public int read(byte[] b,
                int off,
                int len)
         throws IOException

    Reads up to len bytes of data from the input stream into an array of bytes. An attempt is made to read as many as len bytes, but a smaller number may be read, possibly zero. The number of bytes actually read is returned as an integer.

    This method blocks until input data is available, end of file is detected, or an exception is thrown.

    If b is null, a NullPointerException is thrown.

    If off is negative, or len is negative, or off+len is greater than the length of the array b, then an IndexOutOfBoundsException is thrown. 



--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
vandaler
Дата 28.11.2009, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 5.11.2009

Репутация: нет
Всего: нет



точно! спасибо. надо было инициализировать массив.
а вот я получил маччив байт im. мне нужно получить из него картнку. Image.createImage(im, 0, size) выдает исключение IllegalArgument. как правильно?  
PM MAIL   Вверх
W0LF
Дата 29.11.2009, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



вот здесь находится документация по MIDP, так же она есть локально при установке WTK.
и в этой самой документации сказно - 
Цитата

IllegalArgumentException - if imageData is incorrectly formatted or otherwise cannot be decoded

IllegalArgumentException, если данные картинки имеют неправильный формат или же не могут быть декодированы


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
vandaler
Дата 29.11.2009, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 5.11.2009

Репутация: нет
Всего: нет



ага, разобрался. чтение файла из потока блоком оказалось ненадежным. картинка иногда приходит не вся. поэтому, наверное, надо в конец файла добавить какую-то уникальную полследовательность символов, и счиывать до нее. или есть лучшие способы? 
PM MAIL   Вверх
W0LF
Дата 30.11.2009, 04:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



нет, если не использовать udp то картинка должна приходить полностью, есть так называемые тобой блоки, которые разрешают вычитать все доступные на данный момент данный из потока, но это не значит что картинка тебе пришла сразу вся, тебе нужно делать while пока ты не вычитаешь все данные, то есть так бы ты вычитывал по одному байту, что есть намного дольше, а так ты вычитываешь просто блоками, и поэтому тебе нужен внешний цикл, который проверит, все ли пришло.
я понимаю что вопросы будут и на эту тему, так что примерно так - 
Код

int size = is.available();//это вычитает количество доступных байт в текущем блоке
while (size > 0) {
  byte[] im = new byte[size];
  i  = is.read(im, 0, size);
  //делаем чето с нашим im, например добавляем в какой-нидь буффер
  size = is.available();
}


Это сообщение отредактировал(а) W0LF - 30.11.2009, 05:00


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
Dancer
Дата 1.12.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37




  size = is.available(); - это может вернуть 0, но это не будет означать, что мы всё уже приняли. Нельзя по этой вещи организовывать цикл.
лучше смотреть на количество прочитанных байт
  i  = is.read(im, 0, size); - как i у нас станет "-1", это и будет означать, что более уже читать нечего, и можно закругляться.
А когда is.avaliable() возвращает 0, то можно вычитывать по 1 байту, пока не будет достаточно байт, для того чтобы считать их пачкой в массив.



--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
vandaler
Дата 1.12.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 5.11.2009

Репутация: нет
Всего: нет



-1 будет тогда разорвется соединение. правильно?
PM MAIL   Вверх
Dancer
Дата 2.12.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



да, при закрытии коннекшена будет -1.  Или эксепшен, при разрыве соединения.

Код

....
int sizeOfFile;
....
//sizeOfFile чему-то здесь у нас уже равен

ByteArrayOutputStream bufferedStream = new ByteArrayOutputStream ();
int size = 0;
try {
    while(true) {
         int readBytes = is.available();
         if(readBytes == 0) {
             readBytes=1;
         }

         byte[] buf = new byte[readBytes];
         int needRead =0;
         if((size + readBytes) > sizeOfFile) {
             needRead = sizeOfFile - size;
         } else {
             needRead = readBytes;
         }

         int len = is.read(buf, 0, needRead);
         if(len == -1)
             break;

          bufferedStream.write(buf, 0, len);
          size += len;
          if(size == sizeOfFile) 
              break;
    }
} catch(Throwable t) { // точно не помню чего ловим.....
    System.out.println("ERROR: " + t.toString());
}

bufferedStream.flush();
byte[] im = bufferedStream.toByteArray(); // здесь получили наш массив байт.
bufferedStream.close();
bufferedStream = null;
......


Это сообщение отредактировал(а) Dancer - 2.12.2009, 14:08


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
W0LF
Дата 2.12.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



а я всегда порциями читал
и все было нормально, и быстрее
Не, с тобой, Dancer, я никоим образом спорить не буду =)
просто в j2se это точно всегда нормально работает, а в j2me не знаю...

Это сообщение отредактировал(а) W0LF - 2.12.2009, 20:31


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
vandaler
Дата 2.12.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 5.11.2009

Репутация: нет
Всего: нет



Dancer, так в том и дело, что у меня сокет не разрывается. когда он разрывался, я просто использовал createImage(InputStream).
А так разобрался. Благо размер файла не превышает 11 кб, сделал побайтовое чтение для надежности. На скорости не отразилось. Спасибо всем за помощь
PM MAIL   Вверх
Dancer
Дата 3.12.2009, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

Репутация: 33
Всего: 37



vandaler,  ну, да, мой косяк, я когда сначала написал, не особо посмотрел, на твой первый пост.
Но вот код, который привёл, он уже с учётом твоей специфики. (то есть, сокет не закрывается и мы знаем сколько байт нам нужно вычитать. по возможности читаем "куском", если нет, то побайтово)

         if(len == -1)   - это на всякий так сказать случай, типа а вдруг.
            break;

         if(size == sizeOfFile)  - а вот это уже твой случай, то есть мы прочитали столько байт, сколько хотели.
              break;

W0LF,  со мной то как раз стоит спорить smile. Всё знать не возможно, а из спора истина рано или поздно возрадиться. 
Но с этим avaliable() были у меня неприятные моменты, то есть действительно приходил нуль, моделей не помню, но на многих мобилках такое наблюдалось. Поэтому, кто предупреждён - тот вооружён! smile



--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
vandaler
Дата 2.1.2010, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 5.11.2009

Репутация: нет
Всего: нет



у меня ещё вопросец по поводу получения файла:
в одном потоке есть цикл, который постоянно запрашивает и получает файл (побайтово). как бы мне остановить этот процесс независимо от того, на какой стадии он находится? я пытался просто закрывать сокет, а в этом цикле ловить исключение и проверять от чего оно вылезло: если от моего закрытия, то все ок и алерт не вызывается. почему-то время от времени моя программа вылетает 
PM MAIL   Вверх
W0LF
Дата 3.1.2010, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


alexander lonsky
***


Профиль
Группа: Участник
Сообщений: 1164
Регистрация: 9.2.2006
Где: Ukraine.Dnepropet rovsk

Репутация: 19
Всего: 20



Object.wait(), Object.notify(), Object.notifyAll();
снова повторюсь, есть пример с WTK, там в примере с сокетами как раз показывают как правильно остановить, приостановить и тп


--------------------
iOS developer
PM MAIL WWW Skype GTalk   Вверх
vandaler
Дата 4.1.2010, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 5.11.2009

Репутация: нет
Всего: нет



спасибо, буду разбираться!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0975 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.