"สวัสดี Amigo! วันนี้เราจะมาเจาะลึกกันอีกครั้งว่าInputStreamและOutputStreamทำงานอย่างไร คำอธิบายเบื้องต้นนั้นเรียบง่ายไปหน่อย สิ่งเหล่านี้ไม่ใช่ส่วนต่อประสาน แต่เป็นคลาสเชิงนามธรรม และยังมีเมธอดที่ใช้งานอยู่สองสามวิธี ลองมาดูวิธีที่พวกเขามีกัน:"
วิธีการ InputStream | วิธีการทำอะไร |
---|---|
|
วิธีนี้จะอ่านบล็อกของไบต์ทันทีในบัฟเฟอร์ ( อาร์เรย์ไบต์ ) จนกว่าบัฟเฟอร์จะเต็มหรือจนกว่าซอร์สจะไม่มีไบต์ให้อ่านอีก เมธอดส่งคืนจำนวนไบต์ที่อ่านจริง (ซึ่งอาจน้อยกว่าความยาวของอาร์เรย์) |
|
วิธีนี้อ่านหนึ่งไบต์และส่งคืน ผลลัพธ์ถูกขยายเป็น int สำหรับรูปลักษณ์ ถ้าไม่มีไบต์ให้อ่าน เมธอดจะส่งกลับ -1 |
|
เมธอดนี้ส่งคืนจำนวนไบต์ที่ยังไม่ได้อ่าน (มี) |
|
วิธีนี้ «ปิด» สตรีม คุณเรียกสิ่งนี้เมื่อคุณทำงานกับสตรีมเสร็จแล้ว จากนั้นวัตถุจะดำเนินการทำความสะอาดที่จำเป็นในการปิดไฟล์ ฯลฯ ณ จุดนี้ คุณจะไม่สามารถอ่านข้อมูลใด ๆ จากสตรีมได้อีก |
"ดังนั้นเราจึงสามารถอ่านได้ไม่เพียงแค่ไบต์เดียว แต่ยังรวมถึงบล็อกทั้งหมดด้วย"
"อย่างแน่นอน."
"เราสามารถเขียนบล็อกทั้งหมดได้หรือไม่"
"ใช่ ลองดูสิ:"
วิธีการ OutputStream | วิธีการทำอะไร |
---|---|
|
วิธีนี้เขียนหนึ่งไบต์ ประเภท int ถูก จำกัด ให้แคบลงเป็นไบต์ ส่วนพิเศษจะถูกละทิ้งไป |
|
วิธีนี้เขียนบล็อกของไบต์ |
|
วิธีนี้เขียนส่วนหนึ่งของบล็อกไบต์ ใช้ในกรณีที่อาร์เรย์ไบต์อาจไม่เต็ม |
|
หากสตรีมกำลังจัดเก็บข้อมูลใดๆ ที่ยังไม่ได้เขียนไว้ภายใน วิธีการนี้จะบังคับให้เขียน |
|
วิธีนี้ «ปิด» สตรีม คุณเรียกสิ่งนี้เมื่อคุณทำงานกับสตรีมเสร็จแล้ว จากนั้นวัตถุจะดำเนินการทำความสะอาดที่จำเป็นในการปิดไฟล์ ฯลฯ คุณไม่สามารถเขียนข้อมูลไปยังสตรีมได้อีกต่อไป และการล้างข้อมูลจะถูกเรียกโดยอัตโนมัติ |
"โค้ดการคัดลอกไฟล์จะมีลักษณะอย่างไรหากเราอ่านบล็อกทั้งหมดพร้อมกันแทนที่จะอ่านทีละไบต์"
"อืม อะไรประมาณนี้:"
public static void main(String[] args) throws Exception
{
//Create a stream to read bytes from a file
FileInputStream inputStream = new FileInputStream("c:/data.txt");
//Create a stream to write bytes to a file
FileOutputStream outputStream = new FileOutputStream("c:/result.txt");
byte[] buffer = new byte[1000];
while (inputStream.available() > 0) //as long as there are unread bytes
{
//Read the next block of bytes into buffer, and store the actual number of bytes read in count.
int count = inputStream.read(buffer);
outputStream.write(buffer, 0, count); //Write a block (part of a block) to the second stream
}
inputStream.close(); //Close both streams. We don't need them any more.
outputStream.close();
}
"ฉันเข้าใจทุกอย่างเกี่ยวกับบัฟเฟอร์ แต่ตัวแปรนับนี้คืออะไร"
"เมื่อเราอ่านบล็อกข้อมูลล่าสุดจากไฟล์ เราอาจได้รับ 328 ไบต์แทนที่จะเป็น 1,000 ดังนั้นเมื่อเราเขียนข้อมูล เราต้องระบุว่าเราไม่ได้เขียนบล็อกทั้งหมด เฉพาะ 328 บล็อกแรกเท่านั้น ไบต์"
เมื่อเราอ่านบล็อคสุดท้าย วิธี การอ่านจะคืนค่าจำนวนไบต์ที่อ่านจริง 1,000 ทุกครั้งที่เราอ่านบล็อก ยกเว้นบล็อกสุดท้าย เมื่อเราได้ 328
ดังนั้นเมื่อเราเขียนบล็อก เราระบุว่าไม่ควรเขียนทุกไบต์ในบัฟเฟอร์ เพียงแค่ 328 (คือค่าที่เก็บไว้ในตัวแปรนับ)
"ตอนนี้ทุกอย่างชัดเจน ขอบคุณ เอลลี่"
GO TO FULL VERSION