Baca dari InputStream dengan panjang persisnya

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 * returns false, 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);
    }
    

    person johni    schedule 06.02.2016    source sumber
    comment
    Bisakah Anda menunjukkan kode Anda?   -  person beny23    schedule 06.02.2016


    Jawaban (1)


    Arti dari bagian tentang metode ready() dari Reader yang mendasarinya adalah bahwa ia akan memblokir hingga setidaknya satu karakter telah ditransfer, tetapi tidak memblokir lagi. Tidak ada jaminan itu akan mengisi buffer.

    Anda harus mengulang.

    person user207421    schedule 06.02.2016