การสตรีมไฟล์ขนาดใหญ่
ประมวลผลไฟล์ทีละส่วน
การสตรีมไฟล์ขนาดใหญ่ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การอ่านและเขียนไฟล์
- ไดเรกทอรี พาธ และ FileSystemEntity
- การสตรีมไฟล์ขนาดใหญ่
- Stdin, Stdout และอาร์กิวเมนต์ของกระบวนการ