ストリームにデータを追加しようとしています。これはFileStream
でうまく動作しますが、固定バッファーサイズのためにMemoryStream
では正しく動作しません。MemoryStreamに追加
ストリームにデータを書き込むメソッドは、ストリームを作成するメソッドとは分離されています(下の例では大幅に簡略化しました)。ストリームを作成するメソッドは、ストリームに書き込まれるデータの長さを認識しません。
public void Foo(){
byte[] existingData = System.Text.Encoding.UTF8.GetBytes("foo");
Stream s1 = new FileStream("someFile.txt", FileMode.Append, FileAccess.Write, FileShare.Read);
s1.Write(existingData, 0, existingData.Length);
Stream s2 = new MemoryStream(existingData, 0, existingData.Length, true);
s2.Seek(0, SeekOrigin.End); //move to end of the stream for appending
WriteUnknownDataToStream(s1);
WriteUnknownDataToStream(s2); // NotSupportedException is thrown as the MemoryStream is not expandable
}
public static void WriteUnknownDataToStream(Stream s)
{
// this is some example data for this SO query - the real data is generated elsewhere and is of a variable, and often large, size.
byte[] newBytesToWrite = System.Text.Encoding.UTF8.GetBytes("bar"); // the length of this is not known before the stream is created.
s.Write(newBytesToWrite, 0, newBytesToWrite.Length);
}
私が持っていたアイデアは、既存のデータに返されたデータを追加し、その後、関数に拡張可能MemoryStream
を送信することでした。
public void ModifiedFoo()
{
byte[] existingData = System.Text.Encoding.UTF8.GetBytes("foo");
Stream s2 = new MemoryStream(); // expandable capacity memory stream
WriteUnknownDataToStream(s2);
// append the data which has been written into s2 to the existingData
byte[] buffer = new byte[existingData.Length + s2.Length];
Buffer.BlockCopy(existingData, 0, buffer, 0, existingData.Length);
Stream merger = new MemoryStream(buffer, true);
merger.Seek(existingData.Length, SeekOrigin.Begin);
s2.CopyTo(merger);
}
優れた(より効率的な)ソリューションはありますか?
両方の書き込みで拡張ストリームを使用していない理由を説明してください。 – Rotem
ああそう?ストリームs2 =新しいMemoryStream(); //拡張可能な容量のメモリストリーム s2.Write(existingData、0、existingData.Length); WriteUnknownDataToStream(s2); –
はい、それは私の言いたいことです...それはストリームであり、配列ではありません、なぜですか? – Rotem