[.net] MemoryStream에서 문자열을 어떻게 얻습니까?

내가 MemoryStream로 채워 졌다는 메시지가 표시 String되면 어떻게 String되돌려 받을 수 있습니까?



답변

이 샘플은 문자열을 읽고 MemoryStream에 쓰는 방법을 보여줍니다.


Imports System.IO

Module Module1
  Sub Main()
    ' We don't need to dispose any of the MemoryStream 
    ' because it is a managed object. However, just for 
    ' good practice, we'll close the MemoryStream.
    Using ms As New MemoryStream
      Dim sw As New StreamWriter(ms)
      sw.WriteLine("Hello World")
      ' The string is currently stored in the 
      ' StreamWriters buffer. Flushing the stream will 
      ' force the string into the MemoryStream.
      sw.Flush()
      ' If we dispose the StreamWriter now, it will close 
      ' the BaseStream (which is our MemoryStream) which 
      ' will prevent us from reading from our MemoryStream
      'sw.Dispose()

      ' The StreamReader will read from the current 
      ' position of the MemoryStream which is currently 
      ' set at the end of the string we just wrote to it. 
      ' We need to set the position to 0 in order to read 
      ' from the beginning.
      ms.Position = 0
      Dim sr As New StreamReader(ms)
      Dim myStr = sr.ReadToEnd()
      Console.WriteLine(myStr)

      ' We can dispose our StreamWriter and StreamReader 
      ' now, though this isn't necessary (they don't hold 
      ' any resources open on their own).
      sw.Dispose()
      sr.Dispose()
    End Using

    Console.WriteLine("Press any key to continue.")
    Console.ReadKey()
  End Sub
End Module


답변

당신은 또한 사용할 수 있습니다

Encoding.ASCII.GetString(ms.ToArray());

나는 이것이 덜 효율적 이라고 생각 하지 않지만 맹세 할 수는 없었다. 또한 다른 인코딩을 선택할 수 있지만 StreamReader를 사용하면 해당 인코딩을 매개 변수로 지정해야합니다.


답변

StreamReader를 사용하여 MemoryStream을 문자열로 변환

<Extension()> _
Public Function ReadAll(ByVal memStream As MemoryStream) As String
    ' Reset the stream otherwise you will just get an empty string.
    ' Remember the position so we can restore it later.
    Dim pos = memStream.Position
    memStream.Position = 0

    Dim reader As New StreamReader(memStream)
    Dim str = reader.ReadToEnd()

    ' Reset the position so that subsequent writes are correct.
    memStream.Position = pos

    Return str
End Function


답변

용도 에서는 StreamReader를 , 당신은 사용할 수 있습니다 ReadToEnd의 방법을 반환하는 문자열.


답변

byte[] array = Encoding.ASCII.GetBytes("MyTest1 - MyTest2");
MemoryStream streamItem = new MemoryStream(array);

// convert to string
StreamReader reader = new StreamReader(streamItem);
string text = reader.ReadToEnd();


답변

인코딩이 관련된 경우에는 이전 솔루션이 작동하지 않았습니다. 여기에 “실제 생활”이 있습니다-예를 들어 이것을 올바르게하는 방법 …

using(var stream = new System.IO.MemoryStream())
{
  var serializer = new DataContractJsonSerializer(typeof(IEnumerable<ExportData>),  new[]{typeof(ExportData)}, Int32.MaxValue, true, null, false);
  serializer.WriteObject(stream, model);


  var jsonString = Encoding.Default.GetString((stream.ToArray()));
}


답변

이 경우, 쉬운 방법으로 ReadToEnd메소드 를 실제로 MemoryStream사용하려면이 확장 메소드를 사용하여 다음을 수행 할 수 있습니다.

public static class SetExtensions
{
    public static string ReadToEnd(this MemoryStream BASE)
    {
        BASE.Position = 0;
        StreamReader R = new StreamReader(BASE);
        return R.ReadToEnd();
    }
}

이 방법을 다음과 같이 사용할 수 있습니다.

using (MemoryStream m = new MemoryStream())
{
    //for example i want to serialize an object into MemoryStream
    //I want to use XmlSeralizer
    XmlSerializer xs = new XmlSerializer(_yourVariable.GetType());
    xs.Serialize(m, _yourVariable);

    //the easy way to use ReadToEnd method in MemoryStream
    MessageBox.Show(m.ReadToEnd());
}