ฉันกำลังใช้งานโปรแกรมใน 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 * returnsfalse
, 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);
}