如果给我一个我知道已经填充了一个String
的MemoryStream
,我该如何取回一个String
?
你如何从MemoryStream中获取字符串?
How do you get a string from a MemoryStream?
===============>>#1 票数:451 已采纳
此示例显示如何读取和写入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
===============>>#2 票数:276
你也可以使用
Encoding.ASCII.GetString(ms.ToArray());
我认为效率不高,但我不能发誓。 它还允许您选择不同的编码,而使用StreamReader则必须将其指定为参数。
===============>>#3 票数:99
使用StreamReader将MemoryStream转换为String。
<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
===============>>#4 票数:35
使用StreamReader ,然后您可以使用返回字符串的ReadToEnd方法。
===============>>#5 票数:18
以前的解决方案在涉及编码的情况下不起作用。 这是 - 一种“现实生活” - 例如如何正确地做到这一点......
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()));
}
===============>>#6 票数:16
byte[] array = Encoding.ASCII.GetBytes("MyTest1 - MyTest2");
MemoryStream streamItem = new MemoryStream(array);
// convert to string
StreamReader reader = new StreamReader(streamItem);
string text = reader.ReadToEnd();
===============>>#7 票数:12
在这种情况下,如果您真的想以简单的方式在MemoryStream
使用ReadToEnd
方法,则可以使用此扩展方法来实现此目的:
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());
}
===============>>#8 票数:10
此示例显示如何从MemoryStream中读取字符串,其中我使用了序列化(使用DataContractJsonSerializer),将字符串从某个服务器传递到客户端,然后,如何从作为参数传递的字符串中恢复MemoryStream,然后,反序列化MemoryStream。
我使用了不同帖子的部分来执行此示例。
希望这会有所帮助。
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Threading;
namespace JsonSample
{
class Program
{
static void Main(string[] args)
{
var phones = new List<Phone>
{
new Phone { Type = PhoneTypes.Home, Number = "28736127" },
new Phone { Type = PhoneTypes.Movil, Number = "842736487" }
};
var p = new Person { Id = 1, Name = "Person 1", BirthDate = DateTime.Now, Phones = phones };
Console.WriteLine("New object 'Person' in the server side:");
Console.WriteLine(string.Format("Id: {0}, Name: {1}, Birthday: {2}.", p.Id, p.Name, p.BirthDate.ToShortDateString()));
Console.WriteLine(string.Format("Phone: {0} {1}", p.Phones[0].Type.ToString(), p.Phones[0].Number));
Console.WriteLine(string.Format("Phone: {0} {1}", p.Phones[1].Type.ToString(), p.Phones[1].Number));
Console.Write(Environment.NewLine);
Thread.Sleep(2000);
var stream1 = new MemoryStream();
var ser = new DataContractJsonSerializer(typeof(Person));
ser.WriteObject(stream1, p);
stream1.Position = 0;
StreamReader sr = new StreamReader(stream1);
Console.Write("JSON form of Person object: ");
Console.WriteLine(sr.ReadToEnd());
Console.Write(Environment.NewLine);
Thread.Sleep(2000);
var f = GetStringFromMemoryStream(stream1);
Console.Write(Environment.NewLine);
Thread.Sleep(2000);
Console.WriteLine("Passing string parameter from server to client...");
Console.Write(Environment.NewLine);
Thread.Sleep(2000);
var g = GetMemoryStreamFromString(f);
g.Position = 0;
var ser2 = new DataContractJsonSerializer(typeof(Person));
var p2 = (Person)ser2.ReadObject(g);
Console.Write(Environment.NewLine);
Thread.Sleep(2000);
Console.WriteLine("New object 'Person' arrived to the client:");
Console.WriteLine(string.Format("Id: {0}, Name: {1}, Birthday: {2}.", p2.Id, p2.Name, p2.BirthDate.ToShortDateString()));
Console.WriteLine(string.Format("Phone: {0} {1}", p2.Phones[0].Type.ToString(), p2.Phones[0].Number));
Console.WriteLine(string.Format("Phone: {0} {1}", p2.Phones[1].Type.ToString(), p2.Phones[1].Number));
Console.Read();
}
private static MemoryStream GetMemoryStreamFromString(string s)
{
var stream = new MemoryStream();
var sw = new StreamWriter(stream);
sw.Write(s);
sw.Flush();
stream.Position = 0;
return stream;
}
private static string GetStringFromMemoryStream(MemoryStream ms)
{
ms.Position = 0;
using (StreamReader sr = new StreamReader(ms))
{
return sr.ReadToEnd();
}
}
}
[DataContract]
internal class Person
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public DateTime BirthDate { get; set; }
[DataMember]
public List<Phone> Phones { get; set; }
}
[DataContract]
internal class Phone
{
[DataMember]
public PhoneTypes Type { get; set; }
[DataMember]
public string Number { get; set; }
}
internal enum PhoneTypes
{
Home = 1,
Movil = 2
}
}
===============>>#9 票数:5
Brian的答案稍加修改,允许可选的读取启动管理,这似乎是最简单的方法。 可能不是最有效,但易于理解和使用。
Public Function ReadAll(ByVal memStream As MemoryStream, Optional ByVal startPos As Integer = 0) As String
' reset the stream or we'll get an empty string returned
' remember the position so we can restore it later
Dim Pos = memStream.Position
memStream.Position = startPos
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
===============>>#10 票数:5
为什么不在MemoryStream类型上创建一个很好的扩展方法?
public static class MemoryStreamExtensions
{
static object streamLock = new object();
public static void WriteLine(this MemoryStream stream, string text, bool flush)
{
byte[] bytes = Encoding.UTF8.GetBytes(text + Environment.NewLine);
lock (streamLock)
{
stream.Write(bytes, 0, bytes.Length);
if (flush)
{
stream.Flush();
}
}
}
public static void WriteLine(this MemoryStream stream, string formatString, bool flush, params string[] strings)
{
byte[] bytes = Encoding.UTF8.GetBytes(String.Format(formatString, strings) + Environment.NewLine);
lock (streamLock)
{
stream.Write(bytes, 0, bytes.Length);
if (flush)
{
stream.Flush();
}
}
}
public static void WriteToConsole(this MemoryStream stream)
{
lock (streamLock)
{
long temporary = stream.Position;
stream.Position = 0;
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8, false, 0x1000, true))
{
string text = reader.ReadToEnd();
if (!String.IsNullOrEmpty(text))
{
Console.WriteLine(text);
}
}
stream.Position = temporary;
}
}
}
当然,在将这些方法与标准方法结合使用时要小心。 :) ...如果你这样做,你需要使用那个方便的streamLock来实现并发性。
ask by Brian translate from so
未解决问题?本站智能推荐:
1回复
使用MemoryStream会导致内存不足异常
多次使用MemoryStream时遇到问题。
例:
这段代码循环浏览PDF文件页面上的图像。 该文件最多可包含cca 500页,每页上说5张图片。 它导致数千次迭代。 问题是MemoryStream没有释放,并导致内存不足异常。 XImage通常具有大约250 kB。
1回复
MemoryStream看起来像是使用iTextSharp损坏了文件
我有两个代码:
效果很好! 该文件具有46.451字节
但是我需要使用内存而不是文件。 所以我尝试了下一个代码:
该文件具有45.582字节。 Acrobat Reader告诉我该文件已损坏。 我做错了什么?
谢谢!
2回复
发送电子邮件附件会增加.net中的附件文件大小
我目前正在处理一段代码,需要在它生成的电子邮件中发送附件。 附件是PDF文档。 由于要求,我无法保存PDF并将其发送,因此必须创建一个内存流附件。
我的问题是文件大小为_500KB。 但是,将文件保存在我的计算机上,大约370KB。
文件大小的这种增加是不可接受的。 有人遇到
2回复
快速获取MemoryStream内容为ASCII字符串的方法
我在MemoryStream中有一个JSON字符串。 我使用以下代码将其作为ASCII字符串输出:
什么是更短/最短的方式?
1回复
如何获取字符串中的先前字符
我正在创建一个函数,该函数将允许我在for循环中获取字符串中的前一个字符。
因此,如果HTextDisplay.Text为“ ABCDEFG”,则msgbox将显示“ A”,然后显示“ B”,然后显示“ C” ..
另一方面,如果我可以检查for循环函数中的字符后面是否有一个字符,
6回复
字符串操作-在其他两个字符串之间获取字符串?
我有一大部分文字与此类似:
!#__ KT __#!COMMANDHERE!#__ KT __#!
我想在VB.Net中获得字符串的“ COMMANDHERE”部分,我将如何去做呢? 到目前为止,我有:
但是,这只会删除LAST字符串,例如: #__ KT __#! 命令
1回复
如何使用变量名获取字符串部分
我有一个用vb.net编写的程序,其中包含许多彼此非常相似的变量。 例如,其中之一是
如您所见,我的变量由iPhone的型号(iPhone 4S / 5等)和固件版本(8.0 / 8.0.1等)组成。现在,当用户选择“设备”组合时, +“固件”,我的工具必须在另一个称为“活动”的字符串
3回复
Last不是String()的成员-VB.Net获取字符串的最后一个单词
我正在尝试获取字符串的最后一个单词。 我用空格分割了字符串,然后得到Last,但是显示错误“ Last不是String()的成员”
我究竟做错了什么?
注意:我确实有一个System.Linq参考
9回复
如何从.NET中的Stream获取MemoryStream?
我有以下构造方法从文件路径打开MemoryStream :
我需要更改它以接受Stream而不是文件路径。 什么是从Stream对象获取MemoryStream最简单/最有效的方法?
4回复
从VB.Net中的二进制文件中提取字符串
我想从包含嵌入式SQL语句的某些二进制文本文件中抓取字符串数据。 我不需要任何花哨的清理工作,只需某种方式即可提取可读文本。 我正在使用vb.net,但是调用外部实用程序也可以。