2010-05-21 71 views
11

實例化一個Stream對象(如MemoryStream)和調用memoryStream.Write()方法寫入流並實例化一個StreamWriter對象與流並調用streamWriter.Write()有什麼區別?調用Stream.Write和使用StreamWriter有什麼區別?

考慮以下情形:

您必須接受一個流,寫入值,並返回一個方法。該流將在稍後被讀取,因此該位置必須被重置。有兩種可能的方式來做到這一點(兩者似乎都有效)。

// Instantiate a MemoryStream somewhere 
//  - Passed to the following two methods 
MemoryStream memoryStream = new MemoryStream(); 

// Not using a StreamWriter 
private static Stream WriteToStream(Stream stream, string value) 
{ 
    stream.Write(Encoding.Default.GetBytes(value), 0, value.Length); 
    stream.Flush(); 
    stream.Position = 0; 
    return stream; 
} 

// Using a StreamWriter 
private static Stream WriteToStreamWithWriter(Stream stream, string value) 
{ 
    StreamWriter sw = new StreamWriter(stream); 
    sw.Write(value, 0, value.Length); 
    sw.Flush(); 
    stream.Position = 0; 
    return stream; 
} 

這是部分範圍問題,因爲我不想在寫入後關閉流,因爲它將在稍後讀取。我當然也不想處置它,因爲那會關閉我的流。不同之處似乎是沒有使用StreamWriter引入了對Encoding.Default的直接依賴,但我不確定這是一個非常大的交易。有什麼區別?

回答

12

使用StreamWriter,您可以擁有更高級別的重載,可以將各種類型的信息寫入流中,而無需擔心細節。例如你的代碼

sw.Write(value, 0, value.Length); 

實際上可能只是

sw.Write(value); 

使用StreamWriter.Write(串)的過載。

1

對於byte[]數組而言,沒有什麼,StreamWriter確實會引入其他更有用的方法,但與其他類型一起工作。

0

StreamWriter是Stream的超類,它實現了一個TextWriter以便於處理文本。但既然是超級類,除了文本處理之外,它具有所有相同的方法。這就是爲什麼你需要在第一個例子中使用Encoding.Default.GetBytes(value),而在第二個例子中你不需要。

+0

StreamWriter從TextWriter下降,而不是Stream。如果說StreamWriter是Streams和TextWriters之間的適配器,那將是正確的。 – nlaq 2015-07-16 00:19:19

相關問題