如果我给了一个MemoryStream,我知道已经填充了一个字符串,我如何得到一个字符串回来?
当前回答
以前的解决方案在涉及编码的情况下不起作用。这是一个“现实生活”的例子,如何正确地做到这一点…
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()));
}
其他回答
使用StreamReader,然后你可以使用ReadToEnd方法返回一个字符串。
我需要集成一个类,需要一个流写在它:
XmlSchema schema;
// ... Use "schema" ...
var ret = "";
using (var ms = new MemoryStream())
{
schema.Write(ms);
ret = Encoding.ASCII.GetString(ms.ToArray());
}
//here you can use "ret"
// 6 Lines of code
我创建了一个简单的类,可以帮助减少多次使用的代码行:
public static class MemoryStreamStringWrapper
{
public static string Write(Action<MemoryStream> action)
{
var ret = "";
using (var ms = new MemoryStream())
{
action(ms);
ret = Encoding.ASCII.GetString(ms.ToArray());
}
return ret;
}
}
然后可以用一行代码替换示例
var ret = MemoryStreamStringWrapper.Write(schema.Write);
为什么不在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。
使用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
只使用方法Convert。ToBase64String
Convert.ToBase64String(inputStream.ToArray());
推荐文章
- 如何分割逗号分隔的字符串?
- Java字符串—查看字符串是否只包含数字而不包含字母
- 用javascript检查输入字符串中是否包含数字
- 按类型查找WPF窗口中的所有控件
- 数组与列表的性能
- Java:检查enum是否包含给定的字符串?
- 从Description属性中获取Enum
- 用PHP删除字符串的前4个字符
- 如何从字符串的开始或结束删除所有空白?
- 为什么使用try {} finally{}和一个空的try块?
- 字符串到JS中的对象
- 为什么Python的原始字符串不能以一个反斜杠结尾?
- 如何在内存中获取对象大小?
- 每个优秀的。net开发人员都应该能够回答的问题?
- 我如何读整个文件到性病::字符串在c++ ?