"สวัสดี Amigo! วันนี้เราจะมาเจาะลึกกันอีกครั้งว่าInputStreamและOutputStreamทำงานอย่างไร คำอธิบายเบื้องต้นนั้นเรียบง่ายไปหน่อย สิ่งเหล่านี้ไม่ใช่ส่วนต่อประสาน แต่เป็นคลาสเชิงนามธรรม และยังมีเมธอดที่ใช้งานอยู่สองสามวิธี ลองมาดูวิธีที่พวกเขามีกัน:"

วิธีการ InputStream วิธีการทำอะไร
int read(byte[] buff);
วิธีนี้จะอ่านบล็อกของไบต์ทันทีในบัฟเฟอร์ ( อาร์เรย์ไบต์ ) จนกว่าบัฟเฟอร์จะเต็มหรือจนกว่าซอร์สจะไม่มีไบต์ให้อ่านอีก
เมธอดส่งคืนจำนวนไบต์ที่อ่านจริง (ซึ่งอาจน้อยกว่าความยาวของอาร์เรย์)
int read();
วิธีนี้อ่านหนึ่งไบต์และส่งคืน ผลลัพธ์ถูกขยายเป็น int สำหรับรูปลักษณ์ ถ้าไม่มีไบต์ให้อ่าน เมธอดจะส่งกลับ -1
int available();
เมธอดนี้ส่งคืนจำนวนไบต์ที่ยังไม่ได้อ่าน (มี)
void close();
วิธีนี้ «ปิด» สตรีม คุณเรียกสิ่งนี้เมื่อคุณทำงานกับสตรีมเสร็จแล้ว
จากนั้นวัตถุจะดำเนินการทำความสะอาดที่จำเป็นในการปิดไฟล์ ฯลฯ
ณ จุดนี้ คุณจะไม่สามารถอ่านข้อมูลใด ๆ จากสตรีมได้อีก

"ดังนั้นเราจึงสามารถอ่านได้ไม่เพียงแค่ไบต์เดียว แต่ยังรวมถึงบล็อกทั้งหมดด้วย"

"อย่างแน่นอน."

"เราสามารถเขียนบล็อกทั้งหมดได้หรือไม่"

"ใช่ ลองดูสิ:"

วิธีการ OutputStream วิธีการทำอะไร
void write(int c);
วิธีนี้เขียนหนึ่งไบต์ ประเภท int ถูก จำกัด ให้แคบลงเป็นไบต์ ส่วนพิเศษจะถูกละทิ้งไป
void write(byte[] buff);
วิธีนี้เขียนบล็อกของไบต์
void write(byte[] buff, int from, int count);
วิธีนี้เขียนส่วนหนึ่งของบล็อกไบต์ ใช้ในกรณีที่อาร์เรย์ไบต์อาจไม่เต็ม
void flush();
หากสตรีมกำลังจัดเก็บข้อมูลใดๆ ที่ยังไม่ได้เขียนไว้ภายใน วิธีการนี้จะบังคับให้เขียน
void close();
วิธีนี้ «ปิด» สตรีม คุณเรียกสิ่งนี้เมื่อคุณทำงานกับสตรีมเสร็จแล้ว
จากนั้นวัตถุจะดำเนินการทำความสะอาดที่จำเป็นในการปิดไฟล์ ฯลฯ คุณไม่สามารถเขียนข้อมูลไปยังสตรีมได้อีกต่อไป และการล้างข้อมูลจะถูกเรียกโดยอัตโนมัติ

"โค้ดการคัดลอกไฟล์จะมีลักษณะอย่างไรหากเราอ่านบล็อกทั้งหมดพร้อมกันแทนที่จะอ่านทีละไบต์"

"อืม อะไรประมาณนี้:"

คัดลอกไฟล์บนดิสก์
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 (คือค่าที่เก็บไว้ในตัวแปรนับ)

"ตอนนี้ทุกอย่างชัดเจน ขอบคุณ เอลลี่"