3

При чтении InputStream HttpURLConnection существует ли какая-либо причина использовать одно из следующего над другим? Я видел оба примера.Чтение HttpURLConnection InputStream - ручной буфер или BufferedInputStream?

Руководство Buffer:

while ((length = inputStream.read(buffer)) > 0) { 
    os.write(buf, 0, ret); 
} 

BufferedInputStream

is = http.getInputStream(); 
bis = new BufferedInputStream(is); 
ByteArrayBuffer baf = new ByteArrayBuffer(50); 

int current = 0; 
while ((current = bis.read()) != -1) { 
    baf.append(current); 
} 

EDIT Я еще новичок в HTTP в целом, но один внимание, что приходит на ум, что если я используя постоянное HTTP-соединение, я не могу просто читать до тех пор, пока входной поток не станет пустым? В таком случае мне не нужно будет читать длину сообщения и просто читать входной поток для этой длины?

И аналогично, если НЕ использовать постоянное соединение, то код, который я включил, на 100% полезен для правильного чтения потока?

+0

Что такое 'ByteArrayBuffer'? Но никогда не было никаких причин иметь дело с одиночными байтами, когда вы могли иметь дело с массивами байтов. – EJP

ответ

-1

Только если вы используете BufferedInputStream -специфические методы.

+0

Дополнительное разъяснение добавлено к вопросу. – stormin986

+0

Специальные методы BufferedInputStream, такие как? Он не экспортирует какие-либо методы, кроме тех, которые определены 'InputStream'. – EJP

1

Что касается постоянных HTTP-соединений, это как раз наоборот. Вы должны читать все из входного потока. В противном случае клиент HTTP Java не знает, что HTTP-запрос завершен, и соединение сокета можно повторно использовать.

См http://java.sun.com/javase/6/docs/technotes/guides/net/http-keepalive.html:

Что вы можете сделать, чтобы помочь с Keep-Alive?

Не оставляйте соединение на , игнорируя тело ответа. При этом может привести к простоям TCP-соединений. Это должен быть сбор мусора , когда они больше не ссылаются.

Если getInputStream() успешно возвращает, прочитайте весь ответ body.

5

Я говорю о хорошем способе сделать это в своем блоге в сообщении об использовании JSON в Android. http://blog.andrewpearson.org/2010/07/android-why-to-use-json-and-how-to-use.html. Я буду размещать соответствующую часть соответствующей должности ниже (код довольно обобщенный):

InputStream in = null; 
String queryResult = ""; 
try { 
    URL url = new URL(archiveQuery); 
    HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); 
    HttpURLConnection httpConn = (HttpURLConnection) urlConn; 
    httpConn.setAllowUserInteraction(false); 
    httpConn.connect(); 
    in = httpConn.getInputStream(); 
    BufferedInputStream bis = new BufferedInputStream(in); 
    ByteArrayBuffer baf = new ByteArrayBuffer(50); 
    int read = 0; 
    int bufSize = 512; 
    byte[] buffer = new byte[bufSize]; 
    while(true){ 
      read = bis.read(buffer); 
      if(read==-1){ 
       break; 
      } 
      baf.append(buffer, 0, read); 
    } 
    queryResult = new String(baf.toByteArray()); 
    } catch (MalformedURLException e) { 
      // DEBUG 
      Log.e("DEBUG: ", e.toString()); 
    } catch (IOException e) { 
      // DEBUG 
      Log.e("DEBUG: ", e.toString()); 
    } 
} 
+1

Существует одна определенная, но исправляемая: вы всегда должны указывать кодировку для преобразования байтов в String (новая строка (baf.toByteArray(), «UTF-8»). – StaxMan

0

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

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