1. InputStreamReader
ชั้นเรียน
คุณสมบัติที่น่า สนใจอีกอย่างของสตรีมคือคุณสามารถรวมหลาย ๆ สตรีมเข้าด้วยกันเป็นสายโซ่ สตรีมสามารถอ่านข้อมูลได้ไม่เพียงแค่จากแหล่งข้อมูลภายในเท่านั้น แต่ยังอ่านข้อมูลจากสตรีมอื่นได้ อีกด้วย
นี่เป็นกลไกที่มีประสิทธิภาพมากใน Java ซึ่งทำให้สามารถสร้างสถานการณ์การอ่านข้อมูลที่ซับซ้อนได้โดยการเชื่อมต่อสตรีมหนึ่งไปยังอีกสตรีมหนึ่ง รูปแบบดังกล่าวมีลักษณะดังนี้:
เมื่อโปรแกรมอ่านข้อมูลจากสตรีมข้อมูล สตรีมข้อมูลก็จะอ่านข้อมูลจากแหล่งข้อมูลซึ่งเป็นสตรีมข้อมูลอื่นหรือไฟล์ เป็นต้น
ยิ่งไปกว่านั้น สตรีมข้อมูลแต่ละรายการไม่เพียงแต่อ่านและให้ข้อมูลเท่านั้น แต่ยังสามารถแปลงหรือดำเนินการต่างๆ กับข้อมูลนั้นได้อีกด้วย ตัวอย่างที่ดีของ "กระแสกลาง" เช่นInputStreamReader
คลาส
เรารู้จักคลาสที่เรียกว่าFileReader
— เป็นคลาสReader
ที่อ่านข้อมูลจากไฟล์ แล้วจะInputStreamReader
เอาข้อมูลมาจากไหน? ถูกต้อง - จากไฟล์InputStream
.
เมื่อคุณสร้างInputStreamReader
อ็อบเจกต์ คุณต้องส่งผ่านInputStream
ออบเจกต์หรือหนึ่งในคลาสรองลงมา ตัวอย่าง:
String src = "c:\\projects\\log.txt";
FileInputStream input = new FileInputStream(src);
InputStreamReader reader = new InputStreamReader(input);
คลาสInputStreamReader
มีเมธอดทั้งหมดที่Reader
คลาสมี และทำงานในลักษณะเดียวกันทุกประการ
ความแตกต่างที่สำคัญระหว่างInputStreamReader
ชั้นเรียนและพูดFileReader
คือตำแหน่งที่พวกเขาอ่านข้อมูล FileReader
อ่านข้อมูลจากไฟล์ (duh - นั่นคือสาเหตุที่เรียกว่าFileReader
) แต่InputStreamReader
อ่านข้อมูลจากไฟล์InputStream
.
เมื่อคุณอ่านอักขระจากFileReader
วัตถุโดยใช้read()
เมธอด มันจะอ่านสองไบต์จากไฟล์บนดิสก์และส่งกลับเป็นchars
.
เมื่อคุณอ่านอักขระจากInputStreamReader
วัตถุโดยใช้read()
เมธอด มันจะอ่านสองไบต์จากFileInputStream
วัตถุที่ส่งผ่านไปยังวัตถุนั้น ซึ่งจะอ่านข้อมูลจากไฟล์ ผลลัพธ์คือสายการเรียกไปยังread()
เมธอด
2. BufferedReader
ชั้นเรียน
อีกคลาสที่น่าสนใจที่คุณน่าจะใช้บ่อยBufferedReader
คือ นี่ยังเป็น "สตรีมระดับกลาง" ที่อ่านข้อมูลจากสตรีมอื่น
ตามชื่อที่แนะนำBufferedReader
คลาสเป็นคลาสย่อยของReader
และให้คุณอ่านอักขระได้ แต่สิ่งที่น่าสนใจที่สุดคือคุณต้องส่งต่อแหล่งข้อมูลในรูปแบบของสตรีมที่สามารถอ่านอักขระได้เช่น สตรีมที่สืบทอดReader
คลาส
ประเด็นคืออะไร? ซึ่งแตกต่างจากInputStreamReader
คลาสBufferedReader
ไม่แปลงไบต์เป็นอักขระ: มันไม่ได้แปลงอะไรเลย แต่จะบัฟเฟอร์ข้อมูลแทน
เมื่อโปรแกรมอ่านอักขระตัวเดียวจากBufferedReader
ออบเจกต์ ออบเจ็กต์จะอ่านอักขระอาร์เรย์จำนวนมากจากสตรีมต้นทางพร้อมกัน และจัดเก็บไว้ภายใน
เมื่ออ่านอักขระถัดไปจากBufferedReader
ออบเจ็กต์ ก็จะจับอักขระถัดไปจากอาร์เรย์บัฟเฟอร์ภายในแล้วส่งกลับโดยไม่ต้องเข้าถึงแหล่งข้อมูล เฉพาะเมื่ออักขระทั้งหมดในบัฟเฟอร์หมดเท่านั้นที่จะอ่านในอักขระอาร์เรย์ขนาดใหญ่อื่น
คลาส นี้BufferedReader
ยังมีเมธอดที่มีประโยชน์มากString readLine()
ซึ่งช่วยให้คุณอ่านสตริงข้อมูลทั้งหมดจากสตรีมต้นทางพร้อมกันได้ คุณสามารถใช้วิธีนี้เพื่ออ่านไฟล์และแสดงเนื้อหาบนหน้าจอทีละบรรทัด ตัวอย่าง:
เราเขียนโค้ดแบบกะทัดรัดโดยเฉพาะเพื่อแสดงให้เห็นว่าสิ่งนี้สะดวกเพียงใด รหัสนี้สามารถเขียนด้วยรายละเอียดเพิ่มเติมเล็กน้อย
|
สร้างFileReader วัตถุ แหล่งข้อมูลเป็นไฟล์ สร้าง BufferedReader วัตถุ แหล่งข้อมูลคือFileReader . ตราบใดที่ยังมีข้อมูลอยู่ในเครื่องอ่าน อ่านหนึ่งบรรทัด แสดงบรรทัดนั้น |
หากคุณเชื่อมโยงหลาย ๆ สตรีมเข้าด้วยกันclose()
จะต้องเรียกใช้เมธอดที่หนึ่งในนั้นเท่านั้น สตรีมนั้นจะเรียกใช้เมธอดจากแหล่งข้อมูลของมัน และอื่น ๆ จนกว่าจะclose()
ถูกเรียกใช้ในสตรีมข้อมูลสุดท้าย
3. การอ่านจากคอนโซล
และอีกหนึ่งข้อเท็จจริงที่น่าสนใจ: Scanner
คลาสนี้ไม่มีอะไรมากไปกว่าสตรีมอินพุตระดับกลางที่อ่านข้อมูลจากSystem.in
ซึ่งเป็นสตรีมข้อมูลด้วย
ต่อไปนี้เป็นสองวิธีในการอ่านบรรทัดจากคอนโซล:
คลาสสแกนเนอร์ | คลาส BufferedReader และ BufferedWriter |
---|---|
|
|
เพื่อนของเราไม่มีอะไรมากไปกว่าตัวแปรคงที่ของคลาส มันเป็นชื่อของมันSystem.in
in
System
InputStream
in
เกือบตั้งแต่เริ่มต้นการศึกษา Java บน CodeGym คุณได้ทำงานกับสตรีมข้อมูลและสร้างเชนจากพวกมัน แต่ตอนนี้คุณจะทำอย่างมีสติมากขึ้น