InputStreamを使用してHTTPリクエストを読み取る方法は? null
ラインに到達するという保証がないためhttpリクエストを正しく読み込むには?
InputStream in = address.openStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder result = new StringBuilder();
String line;
while((line = reader.readLine()) != null) {
result.append(line);
}
System.out.println(result.toString());
しかしreader.readLine()
は、ブロックされる可能性があります:私はこのようにそれを読むために使用しました。もちろん、私は、Content-Lengthヘッダを読み、ループ内の要求読み取ることができます。
for (int i = 0; i < contentLength; i++) {
int a = br.read();
body.append((char) a);
}
をしかし、コンテンツの長さは(私はそれが目的のために手動で設定することができると思います)大きすぎる設定されている場合は、br.read()
がブロックされます。 私はこのようなのInputStreamから直接バイトを読み取ろう:
byte[] bytes = getBytes(is);
public static byte[] getBytes(InputStream is) throws IOException {
int len;
int size = 1024;
byte[] buf;
if (is instanceof ByteArrayInputStream) {
size = is.available();
buf = new byte[size];
len = is.read(buf, 0, size);
} else {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
buf = new byte[size];
while ((len = is.read(buf, 0, size)) != -1)
bos.write(buf, 0, len);
buf = bos.toByteArray();
}
return buf;
}
しかし、それは永遠に待ちます。何ですか?
なぜ「ヌル」行に到達する保証はありませんか?ドキュメントによると、ストリームの終わりに達した場合は 'nullを返します。したがって、接続が閉じられた場合は、最後の行を読み取った後にnullが返されます。 –
私が到達できる最初のヌルラインは、ヘッダーと要求本体(フォームデータなど)の間の区切りです。しかし、体の後にヌルラインはありません。何ですか? – Tony
あなたは空のボディでリクエストを受けることがありますか? –