2013-08-01 2 views
1

Недавно я задал этот вопрос на SO: Grabbing JSON works from one link, not from anotherПодсчет длины JSON в Android

я получил ответ, в основном о том, что getContentLength не является обязательным на сервере, так что я должен был бы вручную посчитать длину самостоятельно. Ну, мне потребовалось некоторое время, но я придумал какой-то код, который, похоже, получил правильный счет, но я не уверен, что это правильный способ сделать это. В основном из-за моего заявления while(0==0).

Точный ответ я получил:

контентного длина заголовка задается отвечающему сервером. Это необязательно, и Google не хочет отправлять его для динамически генерируемого контента (большинство серверов этого не делают). Поэтому вам нужно будет прочитать поток до тех пор, пока не выберете байты, а не сделайте это за один раз.

Так что это мой код, который я придумал:

Reader reader = new InputStreamReader(inputStream); 
int contentLength=0; 
int cur; 
while (0==0){ 
cur = reader.read(); 
if (cur == -1) { 
break; 
} else { 
contentLength++; 
} 
} 

ли это, кажется, как жизнеспособное решение для подсчета длины контента, если сервер не дает вам один?

+0

Лучше заменить while (0 == 0) с while (true), но зачем вам нужен размер вообще. Вы не можете получить размер без чтения всех данных. – MTilsted

+0

Если вы читаете мой другой вопрос, я просто пытаюсь получить данные JSON, но способ, которым я занимаюсь, теперь требует длины содержимого. Вы видите лучший способ? – EGHDK

+0

Если вы используете существующую библиотеку парсеров JSon, то эта библиотека, скорее всего, получила метод, который может анализировать Json непосредственно из потока. Но если вы попытаетесь написать свой собственный json-анализ (Why ???), взгляните на http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string – MTilsted

ответ

0

Вы можете легко подсчитать длину байтов InputStream контента, посланное сервером в 2 строки:

ByteArrayInputStream bais = new ByteArrayInputStream(inputStream); 
int length = bias.toByteArray().length; 

, относящиеся к вашему подходу:

int contentLength=0; 
while (reader.read()>0){ 
contentLength++; 
} 

Но что происходит с ответом, предложенной в вопросе ссылка: int contentLength = connection.getContentLength();

Это абсолютно разумно и жизнеспособно.

+0

Do not используйте это для больших потоков, хотя -ByteArray создает копию данных в массиве. Это дорого с точки зрения времени и памяти. –

+0

Большой ... как в? 800 символов? или 8000? – EGHDK

+0

@GabeSechan Да, согласитесь. Но если его вопрос малых ответов, время и выделенная память могут быть незначительными. –

Смежные вопросы