0Pricing
Dart Academy · บทเรียน

การสตรีมไฟล์ขนาดใหญ่

ประมวลผลไฟล์ทีละส่วน

การสตรีมไฟล์ขนาดใหญ่ เป็นบทเรียน Dart Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Dart Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Dart Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงไม่อ่านทั้งหมด

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

เปิดสตรีมการอ่าน

เรียกใช้ openRead กับ File เพื่อรับสตรีมของกลุ่มไบต์ คุณประมวลผลแต่ละกลุ่มแล้วปล่อยกลุ่มเก่าทิ้งไป

final stream = File('big.log').openRead();

วนอ่านกลุ่มข้อมูล

ใช้ await for เพื่อรับแต่ละกลุ่มเมื่อมาถึง หน่วยความจำจะคงที่ไม่ว่าไฟล์จะมีขนาดใหญ่ขึ้นเพียงใด

await for (final chunk in stream) { use(chunk); }

ไบต์ต้องถอดรหัส

แต่ละกลุ่มเป็นไบต์ดิบ หากต้องการอ่านข้อความ ให้ส่งสตรีมผ่าน utf8.decoder เพื่อรับชิ้นส่วน String แทน

stream.transform(utf8.decoder);

แยกเป็นบรรทัด

ต่อ LineSplitter หลังตัวถอดรหัส แล้วสตรีมจะส่งออกทีละบรรทัดอย่างเป็นระเบียบ พร้อมให้จัดการ

stream.transform(utf8.decoder).transform(LineSplitter());

นับบรรทัดอย่างประหยัด

ตอนนี้การนับไฟล์ที่มีหนึ่งล้านบรรทัดก็ทำได้ง่ายและใช้ทรัพยากรน้อย เพิ่มค่าตัวนับภายในลูป โดยไม่เก็บไฟล์ทั้งหมดไว้ในหน่วยความจำ

var n = 0; await for (final l in lines) n++;

เปิดสตรีมการเขียน

กำลังเขียนเอาต์พุตขนาดใหญ่ใช่ไหม openWrite จะคืนค่า IOSink ที่คุณป้อนข้อมูลให้ทีละน้อย พร้อมเขียนข้อมูลลงดิสก์ไปเรื่อย ๆ

final sink = File('out.txt').openWrite();

ป้อนข้อมูลลงใน sink

ส่งข้อความด้วย sink.write หรือ sink.writeln ภายในลูป การเรียกแต่ละครั้งจะสตรีมข้อมูลเพิ่มเติมโดยไม่ต้องสร้าง String ขนาดมหึมาขึ้นใหม่

for (final row in rows) sink.writeln(row);

ปิด sink เสมอ

เมื่อทำเสร็จแล้ว ให้เรียกใช้ close และรอผล การทำเช่นนี้จะเขียนไบต์สุดท้ายให้เรียบร้อยและปล่อยตัวจัดการไฟล์

await sink.close();

ส่งสตรีมไปยัง sink

หากต้องการคัดลอกไฟล์อย่างมีประสิทธิภาพ ให้ใช้ pipe ส่งสตรีมการอ่านตรงไปยัง sink การเขียน Dart จะจัดการการควบคุมความเร็วของข้อมูลให้คุณ

await source.openRead().pipe(target.openWrite());

จัดการข้อผิดพลาดของสตรีม

สตรีมอาจล้มเหลวระหว่างการทำงาน ให้ครอบลูปด้วย try/catch เพื่อไม่ให้ข้อผิดพลาดในการอ่านทำให้ผลลัพธ์เสียหายโดยไม่รู้ตัว

try { await for (final c in stream) {} } catch (e) {}

ตรวจสอบความเข้าใจ

คุณต้องประมวลผลบันทึกขนาด 5 GB บนเครื่องขนาดเล็ก วิธีใดเหมาะสมที่สุด

สรุปทบทวน

ตอนนี้คุณสามารถอ่านข้อมูลแบบสตรีมด้วย openRead ถอดรหัสและแยกเป็นบรรทัด เขียนข้อมูลทีละน้อยผ่าน IOSink และใช้ pipe เพื่อคัดลอกข้อมูลได้อย่างรวดเร็ว

คำถามที่พบบ่อย

บทเรียน “การสตรีมไฟล์ขนาดใหญ่” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสตรีมไฟล์ขนาดใหญ่” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Dart Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Dart Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสตรีมไฟล์ขนาดใหญ่”

ประมวลผลไฟล์ทีละส่วน คุณปฏิบัติ Dart Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Dart Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Dart Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การสตรีมไฟล์ขนาดใหญ่” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Dart Academy นี้ได้ไหม

ได้ บทเรียน Dart Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การอ่านและเขียนไฟล์
  2. ไดเรกทอรี พาธ และ FileSystemEntity
  3. การสตรีมไฟล์ขนาดใหญ่
  4. Stdin, Stdout และอาร์กิวเมนต์ของกระบวนการ
← กลับไปที่ Dart Academy