Saya menerapkan program di Java yang mengunduh halaman web menggunakan protokol HTTP. Setelah mengirimkan permintaan GET
ke server dan membaca header respons (termasuk content-length
), program membaca ke dalam array char
jumlah karakter (seperti yang ditentukan dalam content-length
).
Saya sudah mencoba menggunakan keduanya BufferedReader
dan InputStreamReader
kelas.
Masalah
Jika content-length
cukup tinggi, hanya sebagian aliran yang dibaca dan sisa byte tidak disentuh (seperti ujung saya telah membaca semua byte yang tersedia dan ujung lainnya belum selesai menulis).
Alasannya
Sebagaimana dinyatakan dalam dokumentasi kelas BufferedReader
:
This iterated
read
continues until one of the following conditions becomes true: *The specified number of characters have been read The read
method of the underlying stream returns *-1
, indicating end-of-file, or * *The ready
method of the underlying stream * returnsfalse
, indicating that further input requests * would block.
Saya khawatir poin nomor 3 menyebabkan read
berhenti di tengah meskipun jumlah byte yang ditentukan belum terbaca.
Saya dapat mengimplementasikan fungsi ini sendiri, tetapi saya bertanya-tanya apakah ada kelas yang mengabaikan poin nomor 3 dan memblokir hingga semua byte dibaca, saya tidak dapat menemukannya.
try (BufferedReader buffer = new BufferedReader(new InputStreamReader(stream))) {
char[] arr = new char[contentLength];
buffer.read(arr, 0, contentLength);
text.append(arr);
}