ภาพรวม
StringWriter และ StringReader มาจาก TextWriter และ TextReader ตามลำดับ ใช้สำหรับอ่าน/เขียนข้อมูลสตริงในหน่วยความจำ (In-Memory) แทนที่จะเป็นไฟล์จริง
StringWriter - เขียนข้อมูลลง String Buffer
ใช้สำหรับสร้างสตริงอย่างมีประสิทธิภาพ โดยเฉพาะการต่อสตริงหลายครั้ง
คุณสมบัติหลัก
- Implements
TextWriter - เก็บข้อมูลใน
StringBuilderภายใน - มีเมธอด
ToString()เพื่อดึงผลลัพธ์ - รองรับ
Write(),WriteLine(),Flush()
ตัวอย่าง StringWriter
using System;
using System.IO;
class Demo {
static void Main() {
// สร้าง StringWriter
using (StringWriter writer = new StringWriter()) {
writer.WriteLine("Line 1: Hello");
writer.WriteLine("Line 2: World");
writer.Write("Line 3: ");
writer.Write("End");
// ดึงผลลัพธ์เป็น String
string result = writer.ToString();
Console.WriteLine("Result:");
Console.WriteLine(result);
}
}
}
StringReader - อ่านข้อมูลจาก String
ใช้สำหรับอ่านสตริงทีละบรรทัด หรือทีละตัวอักษร เหมือนอ่านไฟล์แต่แหล่งที่มาคือ String ในหน่วยความจำ
คุณสมบัติหลัก
- Implements
TextReader - Constructor รับ String หรือ StringBuilder
- มีเมธอด
Read(),ReadLine(),ReadToEnd(),Peek()
ตัวอย่าง StringReader
using System;
using System.IO;
using System.Text;
class Demo {
static void Main() {
// สร้างข้อมูลทดสอบด้วย StringBuilder
StringBuilder sb = new StringBuilder();
sb.AppendLine("Line one characters");
sb.AppendLine("Line two characters");
sb.AppendLine("Line three characters");
// อ่านด้วย StringReader
using (StringReader reader = new StringReader(sb.ToString())) {
string line;
int lineNumber = 1;
// อ่านทีละบรรทัด
while ((line = reader.ReadLine()) != null) {
Console.WriteLine($"Line {lineNumber++}: {line}");
}
}
// หรืออ่านทั้งหมดทีเดียว
using (StringReader reader = new StringReader(sb.ToString())) {
string all = reader.ReadToEnd();
Console.WriteLine("\n--- All at once ---");
Console.WriteLine(all);
}
}
}
ตัวอย่างรวม: เขียนด้วย StringWriter แล้วอ่านด้วย StringReader
using System;
using System.IO;
class Demo {
static void Main() {
// เขียนข้อมูล
using (StringWriter writer = new StringWriter()) {
writer.WriteLine("Header: Report Data");
writer.WriteLine("Date: " + DateTime.Now.ToShortDateString());
writer.WriteLine("---");
writer.WriteLine("Item 1: Apple - $1.50");
writer.WriteLine("Item 2: Banana - $0.75");
writer.WriteLine("Item 3: Orange - $2.00");
string report = writer.ToString();
// อ่านข้อมูลกลับ
using (StringReader reader = new StringReader(report)) {
Console.WriteLine("=== Reading Report ===");
string line;
while ((line = reader.ReadLine()) != null) {
Console.WriteLine($"[LOG] {line}");
}
}
}
}
}
ตารางเปรียบเทียบ
| คุณสมบัติ | StringWriter | StringReader |
|---|---|---|
| Base Class | TextWriter | TextReader |
| ทิศทาง | Output (เขียน) | Input (อ่าน) |
| แหล่งข้อมูล/ปลายทาง | StringBuilder (Internal) | String / StringBuilder (Constructor) |
| เมธอดหลัก | Write, WriteLine, Flush, ToString | Read, ReadLine, ReadToEnd, Peek |
| การใช้งานทั่วไป | สร้าง Log, Report, XML, JSON | Parse String, อ่าน Config, Test Input |
เมื่อไหร่ควรใช้?
- StringWriter: ต้องการสร้างข้อความจำนวนมาก แทน String Concatenation หรือ StringBuilder โดยตรง
- StringReader: ต้องการอ่าน String แบบ Streaming (ทีละบรรทัด/ตัวอักษร) หรือจำลอง Input Stream สำหรับ Unit Test