อ่านจากความยาวที่แน่นอนของ InputStream

ฉันกำลังใช้งานโปรแกรมใน Java ที่ดาวน์โหลดหน้าเว็บโดยใช้โปรโตคอล HTTP หลังจากส่งคำขอ GET ไปยังเซิร์ฟเวอร์และอ่านส่วนหัวการตอบกลับ (รวมถึง content-length) โปรแกรมจะอ่านจำนวนตัวอักษรลงในอาร์เรย์ char (ตามที่ระบุใน content-length)

ฉันได้ลองใช้ทั้ง BufferedReader และ InputStreamReader คลาส

ปัญหา

หาก content-length สูงเพียงพอ ระบบจะอ่านสตรีมเพียงบางส่วนเท่านั้นและไบต์ที่เหลือจะไม่ถูกแตะต้อง (เช่น ฝั่งของฉันได้อ่านไบต์ที่มีอยู่ทั้งหมดแล้ว และปลายอีกด้านยังเขียนไม่เสร็จ)

เหตุผล

ตามที่ระบุไว้ในเอกสารประกอบของคลาส 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.

  • ฉันเกรงว่าสัญลักษณ์แสดงหัวข้อย่อยหมายเลข 3 จะทำให้ read ปิดการทำงานตรงกลาง แม้ว่าจำนวนไบต์ที่ระบุจะยังไม่ได้อ่านก็ตาม

    ฉันสามารถใช้ฟังก์ชันนี้ด้วยตัวเอง แต่ฉันสงสัยว่ามีคลาสใดบ้างที่ละเว้นสัญลักษณ์แสดงหัวข้อย่อยหมายเลข 3 และบล็อกจนกว่าจะอ่านไบต์ทั้งหมดแล้ว ฉันหาไม่พบ

    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 แหล่งที่มา
    comment
    คุณช่วยแสดงรหัสของคุณได้ไหม?   -  person beny23    schedule 06.02.2016


    คำตอบ (1)


    ความหมายของส่วนที่เกี่ยวกับเมธอด ready() ของ Reader ที่สำคัญคือ มันจะบล็อกจนกว่าจะถ่ายโอนอักขระอย่างน้อยหนึ่งตัว แต่จะไม่บล็อกอีกครั้ง ไม่มีการรับประกันว่าจะเติมบัฟเฟอร์

    คุณต้องวนซ้ำ

    person user207421    schedule 06.02.2016