Saya perlu menulis unit test untuk metode yang mengambil aliran yang berasal dari file teks. Saya ingin melakukan sesuatu seperti ini:
Stream s = GenerateStreamFromString("a,b \n c,d");
c#
unit-testing
string
stream
Omu
sumber
sumber
StringReaderStream
di stackoverflow.com/a/55170901/254109Jawaban:
Jangan lupa untuk menggunakan Menggunakan:
Tentang
StreamWriter
tidak dibuang.StreamWriter
hanyalah pembungkus di sekitar aliran dasar, dan tidak menggunakan sumber daya apa pun yang perlu dibuang. TheDispose
Metode akan menutup mendasariStream
yangStreamWriter
menulis untuk. Dalam hal iniMemoryStream
kita ingin kembali.Di .NET 4.5 sekarang ada kelebihan untuk
StreamWriter
yang membuat aliran yang mendasari terbuka setelah penulis dibuang, tetapi kode ini melakukan hal yang sama dan bekerja dengan versi lain dari .NET juga.Lihat Apakah ada cara untuk menutup StreamWriter tanpa menutup BaseStream-nya?
sumber
GenerateStreamFromString
metode Anda Anda tidak menggunakan Menggunakan dengan StreamWriter. Apakah ada alasan untuk ini?StreamWriter
mungkin melakukan apa yang Anda katakan secara internal. Keuntungannya adalah enkapsulasi dan kode sederhana, tetapi dengan mengorbankan abstrak hal-hal seperti penyandian. Itu tergantung pada apa yang ingin Anda capai.Solusi lain:
sumber
new MemoryStream(Encoding.UTF8.GetBytes("\ufeff" + (value ?? ""))
jika Anda perlu untuk memasukkan BOM pada awal alirannew MemoryStream( value, false )
. Anda tidak dapat membuat aliran dibaca hanya jika Anda harus menulisnya dengan penulis aliran.Tambahkan ini ke kelas utilitas string statis:
Ini menambahkan fungsi ekstensi sehingga Anda dapat:
sumber
StreamWriter
. Cara mengatasinya adalah menggunakan konstruktor yang berbeda - yang memungkinkan saya untuk menentukan leaveOpen .sumber
Gunakan
MemoryStream
kelas, panggilEncoding.GetBytes
untuk mengubah string Anda menjadi array byte terlebih dahulu.Apakah Anda selanjutnya memerlukan
TextReader
on the stream? Jika demikian, Anda bisa menyediakan secaraStringReader
langsung, dan memotongMemoryStream
danEncoding
langkah - langkah.sumber
Saya menggunakan campuran jawaban seperti ini:
Dan kemudian saya menggunakannya seperti ini:
sumber
Kami menggunakan metode ekstensi yang tercantum di bawah ini. Saya pikir Anda harus membuat pengembang membuat keputusan tentang pengkodean, jadi ada sedikit keajaiban yang terlibat.
sumber
return ToStream(s, Encoding.UTF8);
. Dalam implementasi saat ini (return s.ToStream(Encoding.UTF8);
, pengembang dipaksa untuk berpikir lebih keras untuk memahami kode dan tampaknya kasuss == null
tidak tertangani dan melemparNullReferenceException
.Ini dia:
sumber
Versi modern dari metode ekstensi untuk
ToStream
:Modifikasi seperti yang disarankan dalam komentar @ Palec tentang jawaban @Shaun Bowe.
sumber
Saya pikir Anda bisa mendapat manfaat dari menggunakan MemoryStream . Anda bisa mengisinya dengan byte string yang Anda peroleh dengan menggunakan metode GetBytes dari kelas Encoding .
sumber
Jika Anda perlu mengubah penyandian, saya memilih solusi @ShaunBowe . Tetapi setiap jawaban di sini menyalin seluruh string dalam memori setidaknya sekali. Jawaban dengan
ToCharArray
+BlockCopy
kombo melakukannya dua kali.Jika yang penting di sini adalah
Stream
pembungkus sederhana untuk string UTF-16 mentah. Jika digunakan denganStreamReader
pilihEncoding.Unicode
untuk itu:Dan di sini adalah solusi yang lebih lengkap dengan cek terikat yang diperlukan (berasal dari
MemoryStream
sehingga memilikiToArray
danWriteTo
metode juga).sumber
Kombinasi ekstensi String yang baik:
sumber