คุณสามารถอธิบายแนวคิดของสตรีมได้หรือไม่


186

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

ไม่ว่าจะด้วยเหตุผลใดแนวคิดนี้ก็ไม่ได้คลิกเพื่อฉัน ฉันได้อ่านบทความมากมาย แต่ฉันคิดว่าฉันต้องการอุปมาอุปมัยหรืออะไรสักอย่าง

คำตอบ:


234

คำว่า "กระแส" ถูกเลือกเพราะมันหมายถึง (ในชีวิตจริง) ความหมายคล้ายกันมากกับสิ่งที่เราต้องการสื่อเมื่อเราใช้มัน

ลองลืมร้านขายหนังสือสักหน่อยแล้วเริ่มคิดถึงการเปรียบเทียบกับกระแสน้ำ คุณได้รับการไหลของข้อมูลอย่างต่อเนื่องเช่นเดียวกับน้ำไหลอย่างต่อเนื่องในแม่น้ำ คุณไม่จำเป็นต้องทราบว่าข้อมูลมาจากไหนและบ่อยครั้งที่คุณไม่ต้องการ ไม่ว่าจะเป็นไฟล์ซ็อกเก็ตหรือแหล่งอื่น ๆ มันไม่สำคัญ (ไม่ควร) จริงๆ มันคล้ายกันมากกับการรับน้ำซึ่งคุณไม่จำเป็นต้องรู้ว่ามันมาจากไหน ไม่ว่าจะเป็นจากทะเลสาบน้ำพุหรือแหล่งอื่น ๆ มันไม่สำคัญเลย

ที่กล่าวว่าเมื่อคุณเริ่มคิดว่าคุณสนใจเพียงแค่รับข้อมูลที่คุณต้องการไม่ว่าจะมาจากที่ใดบทคัดย่อที่คนอื่นพูดถึงชัดเจนขึ้น คุณเริ่มคิดว่าคุณสามารถพันสายและวิธีการของคุณจะยังคงทำงานได้อย่างสมบูรณ์ ตัวอย่างเช่นคุณสามารถทำสิ่งนี้:

int ReadInt(StreamReader reader) { return Int32.Parse(reader.ReadLine()); }

// in another method:
Stream fileStream = new FileStream("My Data.dat");
Stream zipStream = new ZipDecompressorStream(fileStream);
Stream decryptedStream = new DecryptionStream(zipStream);
StreamReader reader = new StreamReader(decryptedStream);

int x = ReadInt(reader);

อย่างที่คุณเห็นมันเป็นเรื่องง่ายมากที่จะเปลี่ยนแหล่งอินพุตของคุณโดยไม่เปลี่ยนตรรกะการประมวลผลของคุณ ตัวอย่างเช่นหากต้องการอ่านข้อมูลของคุณจากซ็อกเก็ตเครือข่ายแทนที่จะเป็นไฟล์:

Stream stream = new NetworkStream(mySocket);
StreamReader reader = new StreamReader(stream);
int x = ReadInt(reader);

เป็นเรื่องง่ายเท่าที่จะทำได้ และความงามยังคงดำเนินต่อไปในขณะที่คุณสามารถใช้แหล่งสัญญาณเข้าชนิดใดก็ได้ตราบใดที่คุณสามารถสร้างกระแส "กระดาษห่อ" สำหรับมัน คุณสามารถทำได้:

public class RandomNumbersStreamReader : StreamReader {
    private Random random = new Random();

    public String ReadLine() { return random.Next().ToString(); }
}

// and to call it:
int x = ReadInt(new RandomNumbersStreamReader());

ดู? ตราบใดที่วิธีการของคุณไม่สนใจแหล่งที่มาของอินพุตคุณสามารถปรับแต่งแหล่งที่มาของคุณได้หลายวิธี นามธรรมช่วยให้คุณสามารถ decouple อินพุตจากตรรกะการประมวลผลในลักษณะที่สง่างามมาก

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

ดังนั้นเพื่อสรุปกระแสเป็นเพียงแหล่งที่มาของการซ่อนแหล่งที่มา (นามธรรม) แหล่งอื่น ตราบใดที่คุณไม่แยกสิ่งที่เป็นนามธรรมรหัสของคุณจะมีความยืดหยุ่นมาก


6
การคิดเชิงนามธรรม (และการอธิบาย) ดูเหมือนว่าจะอยู่ในเลือดของคุณ;) การเปรียบเทียบของคุณกับน้ำ (และการอ้างอิงเชิงเปรียบเทียบ) ทำให้ฉันนึกถึงโอมาร์คัยยาม
java.is.for.desktop

@HosamAly คำอธิบายของคุณชัดเจนมาก แต่มีบางอย่างที่ทำให้ฉันสับสนเล็กน้อยในรหัสตัวอย่าง การแปลงที่ชัดเจนจากสตริงเป็น int จะทำการ ReadInt โดยอัตโนมัติหรือไม่ ฉันเชื่อว่าฉันสามารถทำ ReadString ได้เช่นกัน?
Rushino

1
@Rushino ไม่มีการแปลงในโค้ดด้านบน วิธีการที่ReadIntกำหนดไว้ที่ด้านบนสุดใช้int.Parseซึ่งได้รับสตริงกลับมาจากreader.ReadLine()และแยกมัน แน่นอนคุณสามารถสร้างReadStringวิธีการที่คล้ายกัน ชัดเจนเพียงพอหรือไม่
Hosam Aly

ใส่กัน Streams ให้ฉันเป็น abstractions ทั่วไปที่ง่ายที่สุดและมีประสิทธิภาพในการเขียนโปรแกรมทั้งหมด การมี. net พื้นฐานStream.Copyทำให้ชีวิตง่ายขึ้นในแอปพลิเคชั่นมากมาย
Felype

38

ประเด็นก็คือคุณไม่ควรต้องรู้ว่าที่เก็บข้อมูลสำรองคืออะไร อันที่จริงมีอาจไม่ได้เป็นร้านค้าที่สนับสนุน - คุณอาจจะอ่านจากเครือข่ายและข้อมูลที่ไม่เคย "เก็บไว้" ที่ทุกคน

หากคุณสามารถเขียนโค้ดที่ทำงานได้ไม่ว่าคุณกำลังพูดคุยกับระบบไฟล์หน่วยความจำเครือข่ายหรือสิ่งอื่นใดที่สนับสนุนแนวคิดสตรีมรหัสของคุณจะยืดหยุ่นกว่ามาก

นอกจากนี้สตรีมมักจะถูกผูกมัดเข้าด้วยกัน - คุณสามารถมีสตรีมที่บีบอัดสิ่งที่ใส่ไว้ในนั้นเขียนแบบฟอร์มที่ถูกบีบอัดไปยังสตรีมอื่นหรือสตรีมที่เข้ารหัสข้อมูล ฯลฯ ที่ส่วนอื่น ๆ จะมีสิ่งที่ตรงกันข้าม โซ่ถอดรหัสถอดรหัสหรืออะไรก็ตาม


ผู้อ่านสตรีมประเภทต่างๆไม่ได้ใช้ในตัวอย่าง @HosamAly ด้านบนหมายความว่าคุณรู้หรือไม่ว่าที่เก็บข้อมูลสำรองคืออะไร ฉันใช้ FileStream, NetworkStream ฯลฯ ... กำลังอ่านจากแหล่งที่มาเหล่านั้น นอกจากนี้มีกรณีที่คุณไม่รู้ว่าที่เก็บข้อมูลสำรองอาจเป็นอะไรและจะเลือกแบบไดนามิกในขณะที่โปรแกรมทำงานหรือไม่ ฉันไม่ได้เจอสิ่งนี้เป็นการส่วนตัวและต้องการทราบข้อมูลเพิ่มเติม
user137717

นอกจากนี้ยังสามารถสตรีมข้อมูลท่อผ่านกระบวนการบางอย่างในขณะที่ข้อมูลถูกสร้างขึ้นหรือฉันต้องการเข้าถึงชุดข้อมูลเต็มรูปแบบที่ฉันต้องการใช้งานเมื่อฉันเริ่มกระบวนการ
user137717

@ user137717: ไม่ถ้าคุณเพิ่งใช้ a- StreamReaderหรือดีกว่าTextReaderรหัสของคุณก็ไม่ทราบว่ากระแสข้อมูลประเภทใดที่รองรับการไหลของข้อมูล หรืออาจใช้BaseStreamคุณสมบัติเพื่อค้นหาประเภท แต่อาจเป็นประเภทที่รหัสของคุณไม่เคยเห็นมาก่อน ประเด็นคือคุณไม่ควรสนใจ และใช่คุณสามารถอย่างจบลงด้วยการเขียนโค้ดซึ่งบางครั้งจะใช้สำหรับการสตรีมเครือข่ายและบางครั้งจะใช้สำหรับการสตรีมไฟล์ สำหรับสตรีมไปป์ไลน์ข้อมูลผ่านกระบวนการ - ดีที่จะไม่ทำในกระบวนการ ... มันจะเป็นผู้ให้บริการกระแส
Jon Skeet

30

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


ใช่มันช่วยให้คุณสามารถแลกเปลี่ยนประเภทของการสตรีมได้โดยไม่ทำให้โค้ดของคุณเสียหาย ตัวอย่างเช่นคุณสามารถอ่านจากไฟล์ในการโทรครั้งเดียวและจากนั้นบัฟเฟอร์หน่วยความจำในครั้งต่อไป
เครก

ฉันจะเพิ่มว่าเหตุผลที่คุณต้องการทำเช่นนี้คือบ่อยครั้งที่คุณไม่ต้องการความสามารถในการค้นหาไฟล์เมื่ออ่านหรือเขียนไฟล์ดังนั้นถ้าคุณใช้สตรีมที่รหัสเดียวกันสามารถใช้อ่านหรือเขียนได้อย่างง่ายดาย ซ็อกเก็ตเครือข่ายตัวอย่างเช่น
alxp

11

มันไม่เกี่ยวกับสายน้ำ แต่เกี่ยวกับการว่ายน้ำ หากคุณสามารถว่ายน้ำหนึ่งสตรีมคุณสามารถว่ายน้ำสตรีมใดก็ได้ที่คุณพบ


7

ในการเพิ่มไปยังห้อง echo สตรีมเป็นสิ่งที่เป็นนามธรรมดังนั้นคุณจึงไม่สนใจร้านค้าต้นแบบ มันสมเหตุสมผลที่สุดเมื่อคุณพิจารณาสถานการณ์ที่มีและไม่มีกระแส

ไฟล์ส่วนใหญ่ไม่น่าสนใจเพราะสตรีมไม่ได้ทำมากไปกว่าวิธีการที่ไม่ใช่สตรีมที่ฉันคุ้นเคย เริ่มจากไฟล์อินเทอร์เน็ตกันก่อน

ถ้าฉันต้องการดาวน์โหลดไฟล์จากอินเทอร์เน็ตฉันต้องเปิดซ็อกเก็ต TCP ทำการเชื่อมต่อและรับไบต์จนกว่าจะไม่มีไบต์เพิ่ม ฉันต้องจัดการบัฟเฟอร์รู้ขนาดของไฟล์ที่คาดหวังและเขียนโค้ดเพื่อตรวจสอบเมื่อการเชื่อมต่อหลุดและจัดการสิ่งนี้อย่างเหมาะสม

สมมติว่าฉันมีวัตถุ TcpDataStream บางอย่าง ฉันสร้างมันด้วยข้อมูลการเชื่อมต่อที่เหมาะสมจากนั้นอ่านไบต์จากสตรีมจนกว่ามันจะบอกว่าไม่มีไบต์อีกต่อไป สตรีมจัดการการจัดการบัฟเฟอร์เงื่อนไขสิ้นสุดข้อมูลและการจัดการการเชื่อมต่อ

ด้วยวิธีนี้สตรีมทำให้ I / O ง่ายขึ้น แน่นอนคุณสามารถเขียนคลาส TcpFileDownloader ที่ทำในสิ่งที่สตรีมทำได้ แต่จากนั้นคุณจะมีคลาสที่เจาะจงสำหรับ TCP อินเทอร์เฟซสตรีมส่วนใหญ่จะให้วิธีการอ่าน () และการเขียน () และแนวคิดที่ซับซ้อนกว่านั้นได้รับการจัดการโดยการนำไปใช้ภายใน ด้วยเหตุนี้คุณสามารถใช้รหัสพื้นฐานเดียวกันเพื่ออ่านหรือเขียนไปยังหน่วยความจำไฟล์ดิสก์ซ็อกเก็ตและที่เก็บข้อมูลอื่น ๆ


5

การมองเห็นที่ฉันใช้คือสายพานลำเลียงไม่ใช่ในโรงงานจริงเพราะฉันไม่รู้อะไรเกี่ยวกับเรื่องนั้น แต่ในโรงงานการ์ตูนที่มีสิ่งต่าง ๆ เคลื่อนไปตามเส้นและได้รับการประทับตราและบรรจุกล่องและนับและตรวจสอบด้วยอุปกรณ์ใบ้

คุณมีส่วนประกอบง่าย ๆ ที่ทำสิ่งหนึ่งเช่นอุปกรณ์ใส่เชอร์รี่กับเค้ก อุปกรณ์นี้มีกระแสอินพุทของเค้กไร้เชอร์รี่และสตรีมเอาท์พุทของเค้กที่มีเชอร์รี่ มีข้อดีสามข้อที่ควรกล่าวถึงการจัดโครงสร้างการประมวลผลของคุณด้วยวิธีนี้

ประการแรกมันลดความซับซ้อนขององค์ประกอบเอง: ถ้าคุณต้องการที่จะใส่ช็อคโกแลตไอซิ่งบนเค้กคุณไม่จำเป็นต้องใช้อุปกรณ์ที่ซับซ้อนที่รู้ทุกอย่างเกี่ยวกับเค้กคุณสามารถสร้างอุปกรณ์โง่ ๆ ที่ติดช็อคโกแลตไอซิ่งลงบนอาหาร การ์ตูนนี่ไปไกลเท่าที่ไม่รู้ว่ารายการต่อไปที่ไม่ใช่เค้กมันคือ Wile E. Coyote)

ประการที่สองคุณสามารถสร้างผลิตภัณฑ์ที่แตกต่างกันโดยวางอุปกรณ์ลงในลำดับที่แตกต่างกัน: บางทีคุณอาจต้องการให้เค้กของคุณมีไอซิ่งบนเชอร์รี่แทนที่จะเป็นเชอร์รี่ที่ด้านบนของไอซิ่งและคุณสามารถทำได้โดยการสลับอุปกรณ์ .

ประการที่สามอุปกรณ์ไม่จำเป็นต้องจัดการสินค้าคงคลังมวยหรือ unboxing วิธีการรวบรวมและบรรจุภัณฑ์ที่มีประสิทธิภาพที่สุดอาจมีการเปลี่ยนแปลง: บางทีวันนี้คุณกำลังวางเค้กของคุณลงในกล่องขนาด 48 และส่งออกโดยรถบรรทุกขนของ แต่ในวันพรุ่งนี้คุณต้องการส่งกล่องหกกล่องเพื่อตอบสนองคำสั่งซื้อที่กำหนดเอง การเปลี่ยนแปลงประเภทนี้สามารถทำได้โดยการเปลี่ยนหรือกำหนดค่าเครื่องใหม่ที่จุดเริ่มต้นและจุดสิ้นสุดของสายการผลิต เครื่องเชอร์รี่ที่อยู่ตรงกลางของบรรทัดไม่จำเป็นต้องเปลี่ยนเพื่อประมวลผลจำนวนรายการที่แตกต่างกันในแต่ละครั้งมันจะทำงานร่วมกับรายการเดียวในแต่ละครั้งและไม่จำเป็นต้องรู้ว่าอินพุตหรือเอาต์พุตของมันเป็นอย่างไร ถูกจัดกลุ่ม


ตัวอย่างที่ดีของการเปรียบเทียบตามคำอธิบาย
Richie Thomas

5

เมื่อฉันได้ยินเกี่ยวกับการสตรีมเป็นครั้งแรกมันอยู่ในบริบทของการสตรีมสดด้วยเว็บแคม ดังนั้นโฮสต์หนึ่งกำลังออกอากาศเนื้อหาวิดีโอและอีกโฮสต์กำลังรับเนื้อหาวิดีโอ ดังนั้นการสตรีมนี้คืออะไร ดี ... ใช่ ... แต่สตรีมสดเป็นแนวคิดที่เป็นรูปธรรมและฉันคิดว่าคำถามนั้นอ้างถึงแนวคิดนามธรรมของสตรีมมิ่ง ดูhttps://en.wikipedia.org/wiki/Live_streaming

งั้นมาเริ่มกันเลย


วิดีโอไม่ใช่ทรัพยากรเพียงอย่างเดียวที่สามารถสตรีมได้ สามารถส่งกระแสข้อมูลเสียงได้เช่นกัน ดังนั้นเรากำลังพูดถึงสตรีมมิ่งมีเดียตอนนี้ ดูhttps://en.wikipedia.org/wiki/Streaming_media สามารถส่งสัญญาณเสียงจากต้นทางไปยังเป้าหมายได้หลายวิธี ลองเปรียบเทียบวิธีการส่งข้อมูลกัน

การดาวน์โหลดไฟล์คลาสสิกการดาวน์โหลดไฟล์ คลาสสิคจะไม่เกิดขึ้นตามเวลาจริง ก่อนที่จะใช้ไฟล์คุณจะต้องรอจนกว่าการดาวน์โหลดจะเสร็จสมบูรณ์

Progressive download chunks การดาวน์โหลดแบบก้าวหน้าดาวน์โหลดข้อมูลจากไฟล์มีเดียแบบสตรีมไปยังบัฟเฟอร์ชั่วคราว ข้อมูลในบัฟเฟอร์นั้นสามารถใช้งานได้: ข้อมูลเสียงและวิดีโอในบัฟเฟอร์นั้นสามารถเล่นได้ เนื่องจากผู้ใช้นั้นสามารถรับชม / ฟังไฟล์มีเดียแบบสตรีมขณะดาวน์โหลดได้ การกรอไปข้างหน้าและการกรอกลับอย่างรวดเร็วเป็นไปได้ปิดการใช้งานพร้อมบัฟเฟอร์ อย่างไรก็ตามการดาวน์โหลดแบบโปรเกรสซีฟไม่ใช่การสตรีมแบบสด

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

เซิร์ฟเวอร์การส่งกระแสข้อมูลช่วยให้การเชื่อมต่อแบบสองทางกับลูกค้าในขณะที่เว็บเซิร์ฟเวอร์ปิดการเชื่อมต่อหลังจากการตอบสนองของเซิร์ฟเวอร์


เสียงและวิดีโอไม่ใช่สิ่งเดียวที่สามารถสตรีมได้ ลองมาดูแนวคิดของสตรีมในคู่มือ PHP

สตรีมเป็นวัตถุทรัพยากรที่แสดงพฤติกรรมแบบสตรีม นั่นคือมันสามารถอ่านหรือเขียนในแบบเชิงเส้นและสามารถ fseek () ไปยังตำแหน่งที่กำหนดเองภายในสตรีม ลิงก์: https://www.php.net/manual/th/intro.stream.php

ใน PHP ทรัพยากรคือการอ้างอิงไปยังแหล่งภายนอกเช่นไฟล์การเชื่อมต่อฐานข้อมูล ดังนั้นกล่าวอีกนัยหนึ่งสตรีมเป็นแหล่งข้อมูลที่สามารถอ่านหรือเขียนได้ ดังนั้นถ้าคุณทำงานกับfopen()คุณก็จะได้ทำงานร่วมกับสตรีมแล้ว

ตัวอย่างของไฟล์ข้อความที่อยู่ภายใต้การสตรีม:

// Let's say that cheese.txt is a file that contains this content: 
// I like cheese, a lot! My favorite cheese brand is Leerdammer.
$fp = fopen('cheese.txt', 'r');

$str8 = fread($fp, 8); // read first 8 characters from stream. 

fseek($fp, 21); // set position indicator from stream at the 21th position (0 = first position)
$str30 = fread($fp, 30); // read 30 characters from stream

echo $str8; // Output: I like c 
echo $str30; // Output: My favorite cheese brand is L

ไฟล์ซิปสามารถสตรีมได้เช่นกัน ยิ่งไปกว่านั้นการสตรีมไม่ได้ จำกัด อยู่ที่ไฟล์ การเชื่อมต่อ HTTP, FTP, SSH และอินพุต / เอาต์พุตสามารถสตรีมได้เช่นกัน


วิกิพีเดียพูดถึงแนวคิดของการสตรีมอย่างไร

ในวิทยาการคอมพิวเตอร์กระแสเป็นลำดับขององค์ประกอบข้อมูลที่ให้บริการในช่วงเวลา สามารถพิจารณาสตรีมเป็นรายการบนสายพานลำเลียงที่ถูกประมวลผลในแต่ละครั้งแทนที่จะเป็นแบทช์ขนาดใหญ่

ดู: https://en.wikipedia.org/wiki/Stream_%28computing%29

วิกิพีเดียเชื่อมโยงไปยังสิ่งนี้: https://srfi.schemers.org/srfi-41/srfi-41.html และผู้เขียนบอกสิ่งนี้เกี่ยวกับสตรีม:

สตรีมบางครั้งเรียกว่ารายการขี้เกียจเป็นโครงสร้างข้อมูลแบบลำดับที่มีองค์ประกอบที่คำนวณตามความต้องการเท่านั้น สตรีมเป็นโมฆะหรือเป็นคู่ที่มีสตรีมใน cdr เนื่องจากองค์ประกอบของสตรีมจะถูกคำนวณเฉพาะเมื่อเข้าถึงสตรีมจึงไม่มีที่สิ้นสุด

ดังนั้นสตรีมจึงเป็นโครงสร้างข้อมูล


ข้อสรุปของฉัน: สตรีมเป็นแหล่งข้อมูลที่สามารถมีข้อมูลที่สามารถอ่านหรือเขียนในลักษณะที่เป็นลำดับ กระแสไม่ได้อ่านทุกอย่างที่แหล่งที่มีในครั้งเดียวมันอ่าน / เขียนตามลำดับ


ลิงค์ที่มีประโยชน์:

  1. http://www.slideshare.net/auroraeosrose/writing-and-using-php-streams-and-sockets-zendcon-2011ให้การนำเสนอที่ชัดเจนมาก
  2. https://www.sk89q.com/2010/04/introduction-to-php-streams/
  3. http://www.netlingo.com/word/stream-or-streaming.php
  4. http://www.brainbell.com/tutorials/php/Using_PHP_Streams.htm
  5. http://www.sitepoint.com/php-streaming-output-buffering-explained/
  6. http://php.net/manual/en/wrappers.php
  7. http://www.digidata-lb.com/streaming/Streaming_Proposal.pdf
  8. http://www.webopedia.com/TERM/S/streaming.html
  9. https://en.wikipedia.org/wiki/Stream_%28computing%29
  10. https://srfi.schemers.org/srfi-41/srfi-41.html

4

มันเป็นเพียงแนวคิดอีกระดับหนึ่งที่เป็นนามธรรมที่ทำให้ชีวิตของคุณง่ายขึ้น และพวกเขาทั้งหมดมีส่วนต่อประสานทั่วไปซึ่งหมายความว่าคุณสามารถรวมเข้าด้วยกันได้เหมือนกัน ตัวอย่างเช่นเข้ารหัสเป็น base64 จากนั้น zip แล้วเขียนสิ่งนี้ลงดิสก์และทั้งหมดในบรรทัดเดียว!


มีประโยชน์แน่นอน แต่ฉันจะไม่บอกว่ามันเป็น "จุดรวม" แม้จะไม่มีการผูกมัด แต่ก็มีประโยชน์ที่จะมีสิ่งที่เป็นนามธรรม
Jon Skeet

ใช่คุณถูก. ฉันเปลี่ยนคำเพื่อให้ชัดเจน
vava

ใช่ดีกว่า หวังว่าคุณคงไม่คิดว่าฉันจู้จี้จุกจิกเกินไป!
Jon Skeet

3

คำอธิบายที่ดีที่สุดของลำธารที่ผมเคยเห็นเป็นบทที่ 3 ของ SICP (คุณอาจต้องอ่าน 2 บทแรกเพื่อให้เข้าใจได้ แต่คุณควรจะทำเช่นนั้น :-)

พวกเขาไม่ได้ใช้ sterams เป็นจำนวนไบต์เลย แต่เป็นจำนวนเต็ม จุดใหญ่ที่ฉันได้รับจากมันคือ:

  • สตรีมเป็นรายการที่ล่าช้า
  • ค่าใช้จ่ายในการคำนวณ [ของการคำนวณทุกอย่างล่วงหน้าก่อนเวลาในบางกรณี] นั้นเกินความจริง
  • เราสามารถใช้สตรีมเพื่อแสดงลำดับที่มีความยาวไม่สิ้นสุด

จริงๆแล้วฉันกำลังอยู่ในบทที่ 1 ของ SICP ขอบคุณ!
Rob Sobers

2
ใครอยากบอกกระแส SICPจากคนอื่น ๆ คุณลักษณะที่สำคัญของกระแส SICPคือความเกียจคร้านในขณะที่ทั่วไปกระแสแนวคิดเน้นนามธรรมในลำดับข้อมูล
象嘉道

2

อีกจุดหนึ่ง (สำหรับสถานการณ์การอ่านไฟล์):

  1. streamสามารถอนุญาตให้คุณทำอย่างอื่นก่อนfinished reading all content of the fileได้
  2. คุณสามารถบันทึกหน่วยความจำได้เนื่องจากไม่จำเป็นต้องโหลดเนื้อหาไฟล์ทั้งหมดพร้อมกัน

1

คิดว่าสตรีมเป็นแหล่งข้อมูลนามธรรม (ไบต์ตัวอักษรและอื่น ๆ ) พวกเขาสรุปกลศาสตร์จริงของการอ่านและการเขียนจากแหล่งข้อมูลที่เป็นรูปธรรมไม่ว่าจะเป็นซ็อกเก็ตเครือข่ายไฟล์บนดิสก์หรือการตอบสนองจากเว็บเซิร์ฟเวอร์


1

ฉันคิดว่าคุณต้องพิจารณาว่าตัวสำรองนั้นมักจะเป็นเพียงนามธรรม สตรีมหน่วยความจำค่อนข้างเข้าใจง่าย แต่ไฟล์มีความแตกต่างอย่างสิ้นเชิงโดยขึ้นอยู่กับระบบไฟล์ที่คุณใช้ไม่ต้องสนใจว่าคุณใช้ฮาร์ดไดรฟ์ใด ในความเป็นจริงสตรีมทั้งหมดไม่ได้อยู่บนแบ็คอัพสโตร์: สตรีมเครือข่ายค่อนข้างเป็นแค่สตรีม

ประเด็นของกระแสคือเรา จำกัด ความสนใจของเราต่อสิ่งที่สำคัญ โดยมีนามธรรมที่เป็นมาตรฐานเราสามารถดำเนินการร่วมกัน ตัวอย่างเช่นแม้ว่าคุณไม่ต้องการค้นหาไฟล์หรือตอบกลับ HTTP สำหรับ URL ในวันนี้ไม่ได้หมายความว่าคุณจะไม่ต้องการในวันพรุ่งนี้

เดิมทีสตรีมมีความรู้สึกเมื่อหน่วยความจำมีขนาดเล็กเมื่อเทียบกับที่เก็บข้อมูล เพียงแค่อ่านไฟล์ C อาจเป็นภาระที่สำคัญ การลดขนาดหน่วยความจำเป็นสิ่งสำคัญอย่างยิ่ง ดังนั้นสิ่งที่เป็นนามธรรมซึ่งจำเป็นต้องโหลดน้อยมากจึงมีประโยชน์มาก วันนี้มันมีประโยชน์พอ ๆ กันเมื่อทำการสื่อสารผ่านเครือข่ายและมันกลับกลายเป็นว่าไม่ค่อยมีข้อ จำกัด เมื่อเราจัดการกับไฟล์ ความสามารถในการเพิ่มสิ่งต่าง ๆ เช่นการบัฟเฟอร์ในแบบทั่วไปทำให้มันมีประโยชน์มากยิ่งขึ้น


0

กระแสข้อมูลเป็นนามธรรมของลำดับของไบต์ แนวคิดคือคุณไม่จำเป็นต้องรู้ว่าไบต์นั้นมาจากไหนเพียงแค่คุณสามารถอ่านมันในแบบมาตรฐาน

ตัวอย่างเช่นหากคุณประมวลผลข้อมูลผ่านสตรีมก็ไม่สำคัญกับรหัสของคุณหากข้อมูลมาจากไฟล์การเชื่อมต่อเครือข่ายสตริงหยดในฐานข้อมูล ฯลฯ ฯลฯ

ไม่มีอะไรผิดปกติในการโต้ตอบกับที่เก็บข้อมูลสำรองยกเว้นว่ามันเชื่อมโยงคุณกับการใช้งานของร้านค้าสำรอง


0

กระแสข้อมูลเป็นสิ่งที่เป็นนามธรรมที่มีชุดวิธีการและคุณสมบัติมาตรฐานสำหรับการโต้ตอบกับข้อมูล โดยการแยกออกจากสื่อจัดเก็บข้อมูลจริงรหัสของคุณสามารถเขียนได้โดยไม่ต้องพึ่งพาการใช้สื่อนั้น ๆ หรือแม้แต่การนำสื่อนั้นไปใช้

การเปรียบเทียบที่ดีอาจจะพิจารณากระเป๋า คุณไม่สนใจว่ากระเป๋าทำจากอะไรหรือทำอะไรเมื่อคุณใส่ของในกระเป๋าตราบใดที่กระเป๋าทำหน้าที่เป็นกระเป๋าและคุณสามารถนำสิ่งของออกมาได้ สตรีมกำหนดสื่อจัดเก็บข้อมูลที่แนวคิดของถุงกำหนดสำหรับอินสแตนซ์ที่แตกต่างกันของถุง (เช่นถุงขยะ, กระเป๋าถือ, เป้, ฯลฯ ) - กฎของการมีปฏิสัมพันธ์


0

ฉันจะให้มันสั้นฉันเพิ่งหายไปคำที่นี่:

สายน้ำเป็นคิวมักจะเก็บไว้ในบัฟเฟอร์ที่มีข้อมูลทุกชนิด

(ตอนนี้เนื่องจากเราทุกคนรู้ว่าคิวคืออะไรจึงไม่จำเป็นต้องอธิบายเพิ่มเติมอีก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.