Как вы получаете строку из MemoryStream?

Если мне дают MemoryStream, который, как я знаю, был заполнен String, как мне вернуть String обратно?

503
задан 13.04.2020, 18:45

4 ответа

Этот образец показывает, как считать и записать строку в 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
453
ответ дан 13.04.2020, 18:48
  • 1
    @MichaelEakins, Почему ответ должен даже быть в C#, когда вопрос отмечен как VB.Net? – Rowland Shaw 13.04.2020, 18:49
  • 2
    Расположите не назван, когда переменная выходит из объема. Завершите будет назван, когда GC находит время для него, но Расположите, что-то, что нужно назвать, прежде чем переменная выходит из объема. Я don' t называют его выше, потому что я знаю реализацию StreamWriter и StreamReader don' t требуют, Располагают, чтобы быть названным, это просто передает вызов базовому потоку. Однако законный аргумент может быть приведен в пользу вызова Dipose для чего-либо, что реализует IDisposable начиная с Вас can' t гарантируют будущий выпуск won' t требуют, чтобы он был расположен. – Brian 13.04.2020, 18:49
  • 3
    Isn' t это собирающийся избавляться от StreamWriter, когда функция выходит из объема так или иначе? – Tim Keating 13.04.2020, 18:50
  • 4
    I' m довольный я узнал о " helpers" передача расположить вызов к их базовым потокам, но это походит на плохое проектное решение. – Gerard ONeill 13.04.2020, 18:51

Используя 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
99
ответ дан 13.04.2020, 18:47
  • 1
    Вы корректны. Это обычно - плохая идея использовать Расположить метод на потоковых классах помощника, особенно если поток передается в метод в качестве параметра. I' ll обновляют этот ответ. У меня также есть более полный ответ ниже. – Brian 13.04.2020, 18:47
  • 2
    Оператор использования гарантирует, что Ваш StreamReader расположен, но в документации говорится, что StreamReader закрывает базовый поток, когда это расположено. Поэтому Ваш метод закрывает MemoryStream, это передается, который концептуально распущен для вызывающих сторон, даже если я сомневаюсь относительно MemoryStream. Расположите делает много. – Trillian 13.04.2020, 18:48
  • 3
    При установке Положения на 0 пределов способность к повторному использованию метода - лучше позволять вызывающей стороне управлять этим. Что, если поток содержит данные до строки, что вызывающая сторона знает, как обработать? – Alex Lyman 13.04.2020, 18:48
  • 4
    Если Вы декомпилируете те классы, you' ll видят, что расположить метод просто звонит, Располагают () на любых потоках, которые не являются пустыми в экземпляре (TextWriter, MemoryStream, и т.д.) – Sinaesthetic 13.04.2020, 18:48

используйте StreamReader, тогда можно использовать метод ReadToEnd , который возвращает строку.

36
ответ дан 13.04.2020, 18:48
  • 1
    Я просто хочу упомянуть, который эти Basestream должен устанавливать его Положение на 0. Как memoryStream.Position = 0;. – Aykut Çevik 13.04.2020, 18:48

Можно также использовать

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

, я не делаю , думают , это менее эффективно, но я не мог поклясться ему. Это также позволяет Вам выбрать различное кодирование, тогда как с помощью StreamReader необходимо было бы определить это в качестве параметра.

283
ответ дан 13.04.2020, 18:49
  • 1
    Кодирование находится в Системе. Текстовое пространство имен – northben 13.04.2020, 18:50
  • 2
    +1: Идеально подходящий для целей поблочного тестирования, спасибо. – rsenna 13.04.2020, 18:51

Теги

Похожие вопросы