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

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

คลาส นี้OutputStreamเป็นคลาสพาเรนต์สำหรับทุกคลาสที่รองรับเอาต์พุตแบบไบต์ นี่คือคลาสนามธรรมที่ไม่ได้ทำอะไรด้วยตัวเอง แต่มีคลาสสืบทอดสำหรับทุกโอกาส

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

แต่กลับไปที่OutputStreamชั้นเรียน คลาสนี้มีเมธอดที่คลาสที่สืบทอดมาทั้งหมดต้องนำไปใช้ นี่คือรายการหลัก:

วิธีการ คำอธิบาย
void write(int b)
เขียนหนึ่งไบต์ (ไม่ใช่ an int) ไปยังสตรีม
void write(byte[] buffer)
เขียนอาร์เรย์ของไบต์ไปยังสตรีม
void write(byte[] buffer, off, len)
เขียนส่วนหนึ่งของอาร์เรย์ของไบต์ไปยังสตรีม
void flush()
เขียนข้อมูลทั้งหมดที่เก็บไว้ในบัฟเฟอร์ไปยังสตรีม
void close()
ปิดสตรีม

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

มาดูวิธีการทั้งหมดของOutputStreamชั้นเรียนโดยสังเขป:

write(int b)วิธี

วิธีนี้เขียนหนึ่งไบต์ (ไม่ใช่ an int) ไปยังเอาต์พุตสตรีม ค่าที่ผ่านจะถูกส่งไปยังไบต์ และสามไบต์แรกของ int จะถูกละทิ้ง

write(byte[] buffer)วิธี

เขียนอาร์เรย์ของไบต์ที่กำหนดไปยังสตรีมเอาต์พุต แค่นั้นแหละ.

write(byte[] buffer, int offset, int length)วิธี

เขียนส่วนหนึ่งของอาร์เรย์ของไบต์ที่ส่งผ่านไปยังเอาต์พุตสตรีม ตัวแปร offset บ่งชี้ดัชนีขององค์ประกอบแรกของอาร์เรย์ และlengthเป็นความยาวของชุดย่อยที่จะเขียน

flush()วิธี

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

close()วิธี

เขียนข้อมูลที่ยังไม่ได้เขียนไปยังวัตถุเป้าหมาย close()ไม่จำเป็นต้องเรียกเมธอดนี้ หากคุณใช้ try-with-resourcesบล็อก

ตัวอย่างการคัดลอกไฟล์

รหัส บันทึก
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileInputStream input = new FileInputStream(src);
FileOutputStream output = new FileOutputStream(dest))
{
   byte[] buffer = new byte[65536]; // 64Kb
   while (input.available() > 0)
   {
      int real = input.read(buffer);
      output.write(buffer, 0, real);
   }
}



InputStreamสำหรับอ่านจากไฟล์
OutputStreamสำหรับเขียนไปยังไฟล์

บัฟเฟอร์ที่เราจะอ่านข้อมูล
ตราบเท่าที่มีข้อมูลในสตรีม

อ่านข้อมูลลงในบัฟเฟอร์
เขียนข้อมูลจากบัฟเฟอร์ไปยังสตรีมที่สอง

2. Writerชั้นเรียน

คลาส นั้นWriterเหมือนกับOutputStreamคลาสทุกประการ แต่มีความแตกต่างเพียงอย่างเดียวอีกครั้ง: มันใช้งานได้กับอักขระ ( char) แทนที่จะเป็นไบต์

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

วิธีการของWriterคลาส (และคลาสที่สืบทอดมาทั้งหมด):

วิธีการ คำอธิบาย
void write(int b)
เขียนอักขระหนึ่งตัว (ไม่ใช่int) ไปยังสตรีม
void write(char[] buffer)
เขียนอาร์เรย์ของอักขระไปยังสตรีม
void write(char[] buffer, off, len)
เขียนส่วนหนึ่งของอาร์เรย์ของอักขระไปยังสตรีม
void write(String str)
เขียนสตริงไปยังสตรีม
void write(String str, off, len)
เขียนส่วนหนึ่งของสตริงไปยังสตรีม
void flush()
เขียนข้อมูลทั้งหมดที่เก็บไว้ในบัฟเฟอร์ไปยังสตรีม
void close()
ปิดสตรีม

เมธอดนั้นคล้ายกับเมธอดของOutputStreamคลาสมาก แต่ทำงานกับอักขระแทนไบต์

คำอธิบายของวิธีการ:

write(int b)วิธี

วิธีนี้เขียนอักขระตัวเดียว ( char— ไม่ใช่ an int) ไปยังเอาต์พุตสตรีม ค่าที่ส่งผ่านจะถูกส่งไปยัง a charและสองไบต์แรกจะถูกละทิ้ง

write(char[] buffer)วิธี

เขียนอาร์เรย์ของอักขระที่กำหนดไปยังสตรีมเอาต์พุต

write(char[] buffer, int offset, int length)วิธี

เขียนส่วนหนึ่งของอาร์เรย์ของอักขระที่ส่งผ่านไปยังเอาต์พุตสตรีม ตัวแปรoffsetระบุดัชนีขององค์ประกอบแรกของอาร์เรย์ และlengthเป็นความยาวของชุดย่อยที่จะเขียน

write(String str)วิธี

เขียนสตริงที่กำหนดไปยังสตรีมเอาต์พุต

write(String str, int offset, int length)วิธี

เขียนส่วนหนึ่งของสตริงที่กำหนดไปยังสตรีมเอาต์พุต: สตริงจะถูกแปลงเป็นอาร์เรย์ของอักขระ ตัวแปรoffsetระบุดัชนีขององค์ประกอบแรกของอาร์เรย์ และlengthเป็นความยาวของชุดย่อยที่จะเขียน

flush()วิธี

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

close()วิธี

เขียนข้อมูลที่ยังไม่ได้เขียนไปยังวัตถุเป้าหมาย close()ไม่จำเป็นต้องเรียกเมธอดนี้ หากคุณใช้ try-with-resourcesบล็อก

ตัวอย่างโปรแกรมที่คัดลอกไฟล์ข้อความ:

รหัส บันทึก
String src = "c:\\projects\\log.txt";
String dest = "c:\\projects\\copy.txt";

try(FileReader reader = new FileReader(src);
FileWriter writer = new FileWriter(dest))
{
   char[] buffer = new char[65536]; // 128Kb
   while (reader.ready())
   {
      int real = reader.read(buffer);
      writer.write(buffer, 0, real);
   }
}



Readerสำหรับอ่านจากไฟล์
Writerสำหรับเขียนลงไฟล์

บัฟเฟอร์ที่เราจะอ่านข้อมูล
ตราบเท่าที่มีข้อมูลในสตรีม

อ่านข้อมูลลงในบัฟเฟอร์
เขียนข้อมูลจากบัฟเฟอร์ไปยังสตรีมที่สอง

StringWriterระดับ

มีคลาสที่น่าสนใจอีกคลาสหนึ่งที่สืบทอดมาWriter: เรียกว่าStringWriter. มันมีสตริงที่ไม่แน่นอน — StringBufferวัตถุ และทุกครั้งที่คุณ "เขียน" บางสิ่งลงในStringWriterวัตถุ ข้อความนั้นจะถูกเพิ่มลงในบัฟเฟอร์ภายใน

ตัวอย่าง:

รหัส บันทึก
StringWriter writer = new StringWriter();
writer.write("Hello");
writer.write(String.valueOf(123));

String result = writer.toString();
StringWriterสร้างสตรีมอักขระเป้าหมาย ( )
สตริงถูกเขียนไปยังบัฟเฟอร์ภายในStringWriter
สตริงถูกเขียนไปยังบัฟเฟอร์ภายในStringWriter

การแปลงเนื้อหาของวัตถุเป็นสตริง

ในกรณีนี้StringWriterคลาสโดยพื้นฐานแล้วเป็น wrapper เหนือStringBufferคลาส แต่StringWriterคลาสนั้นเป็นลูกหลานของWriterคลาสสตรีม และสามารถใช้ในสายโซ่ของสตรีมออบเจกต์ได้ นี่เป็นคุณสมบัติที่มีประโยชน์ในทางปฏิบัติ