1. InputStreamReaderชั้นเรียน

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

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

คลาส InputStreamReader

เมื่อโปรแกรมอ่านข้อมูลจากสตรีมข้อมูล สตรีมข้อมูลก็จะอ่านข้อมูลจากแหล่งข้อมูลซึ่งเป็นสตรีมข้อมูลอื่นหรือไฟล์ เป็นต้น

ยิ่งไปกว่านั้น สตรีมข้อมูลแต่ละรายการไม่เพียงแต่อ่านและให้ข้อมูลเท่านั้น แต่ยังสามารถแปลงหรือดำเนินการต่างๆ กับข้อมูลนั้นได้อีกด้วย ตัวอย่างที่ดีของ "กระแสกลาง" เช่น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()ซึ่งช่วยให้คุณอ่านสตริงข้อมูลทั้งหมดจากสตรีมต้นทางพร้อมกันได้ คุณสามารถใช้วิธีนี้เพื่ออ่านไฟล์และแสดงเนื้อหาบนหน้าจอทีละบรรทัด ตัวอย่าง:

เราเขียนโค้ดแบบกะทัดรัดโดยเฉพาะเพื่อแสดงให้เห็นว่าสิ่งนี้สะดวกเพียงใด รหัสนี้สามารถเขียนด้วยรายละเอียดเพิ่มเติมเล็กน้อย

String src = "c:\\projects\\log.txt";

try(FileReader in = new FileReader(src);
BufferedReader reader = new BufferedReader(in))
{
   while (reader.ready())
   {
      String line = reader.readLine();
      System.out.println(line);
   }
}
สร้างFileReaderวัตถุ แหล่งข้อมูลเป็นไฟล์
สร้างBufferedReaderวัตถุ แหล่งข้อมูลคือFileReader.
ตราบใดที่ยังมีข้อมูลอยู่ในเครื่องอ่าน
อ่านหนึ่งบรรทัด
แสดงบรรทัดนั้น
จุดสำคัญ:

หากคุณเชื่อมโยงหลาย ๆ สตรีมเข้าด้วยกันclose()จะต้องเรียกใช้เมธอดที่หนึ่งในนั้นเท่านั้น สตรีมนั้นจะเรียกใช้เมธอดจากแหล่งข้อมูลของมัน และอื่น ๆ จนกว่าจะclose()ถูกเรียกใช้ในสตรีมข้อมูลสุดท้าย



3. การอ่านจากคอนโซล

และอีกหนึ่งข้อเท็จจริงที่น่าสนใจ: Scannerคลาสนี้ไม่มีอะไรมากไปกว่าสตรีมอินพุตระดับกลางที่อ่านข้อมูลจากSystem.inซึ่งเป็นสตรีมข้อมูลด้วย

ต่อไปนี้เป็นสองวิธีในการอ่านบรรทัดจากคอนโซล:

คลาสสแกนเนอร์ คลาส BufferedReader และ BufferedWriter
InputStream stream = System.in;
Scanner console = new Scanner(stream);
String line = console.nextLine();
InputStream stream = System.in;
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader buff = new BufferedReader(reader);
String line = buff.readLine();

เพื่อนของเราไม่มีอะไรมากไปกว่าตัวแปรคงที่ของคลาส มันเป็นชื่อของมันSystem.ininSystemInputStreamin

เกือบตั้งแต่เริ่มต้นการศึกษา Java บน CodeGym คุณได้ทำงานกับสตรีมข้อมูลและสร้างเชนจากพวกมัน แต่ตอนนี้คุณจะทำอย่างมีสติมากขึ้น