C# 将字符串放入内存并稍后保存
我有一个程序,它创建了一个巨大的字符串,对于C# 将字符串放入内存并稍后保存,c#,string,performance,memory,streamwriter,C#,String,Performance,Memory,Streamwriter,我有一个程序,它创建了一个巨大的字符串,对于StringBuilder来说太大了,无法处理。我想将其存储在内存中,然后在以后的某个日期将其保存到用户定义的目录中。 我尝试了一个StreamWriter,但我需要在创建目录时声明它,这是一个问题,因为如果用户选择“保存到文本文件”,我以后会得到目录 基本上,我需要它: -创建任何对象的实例(公共且在类范围内,不能在方法范围内) -向实例添加字符串 -然后,稍后,每当用户决定时,将其保存到一个文件中。我知道它将占用大量RAM,我相信它将只有50-10
StringBuilder
来说太大了,无法处理。我想将其存储在内存中,然后在以后的某个日期将其保存到用户定义的目录中。
我尝试了一个StreamWriter
,但我需要在创建目录时声明它,这是一个问题,因为如果用户选择“保存到文本文件”,我以后会得到目录
基本上,我需要它:
-创建任何对象的实例(公共且在类范围内,不能在方法范围内)
-向实例添加字符串
-然后,稍后,每当用户决定时,将其保存到一个文件中。我知道它将占用大量RAM,我相信它将只有50-100Mb左右,这并不太糟糕
public class ImageProcessor
{
MemoryStream ms = new MemoryStream();
StreamWriter sw;
public Bitmap Rendering(string bmpPath)
{
sw = new StreamWriter(ms, System.Text.Encoding.UTF8);
using (ms)
sw.Write(Convert.ToString(ArGBformat)); //Error is here
}
}
`以下是一段代码片段,可能会对您有所帮助。我刚刚在VS 2012中测试过:
using (MemoryStream ms = new MemoryStream)
{
StreamWriter sw = new StreamWriter(ms, System.Text.Encoding.UTF8)
sw.WriteLine("This is a test.");
sw.WriteLine("This is a second line.");
sw.Flush();
using (FileStream fs = new FileStream("Test.txt", FileMode.Create))
{
ms.CopyTo(fs);
}
sw.Close();
}
文件内容包括:
This is a test.
This is a second line.
您可能希望修改它以适应程序的设计,但基本思想是使用StreamWriter
将文本写入MemoryStream
,然后使用MemoryStream.CopyTo
方法(采用流
)将MemoryStream
写入文件
小心你如何构造东西-如果你关闭StreamWriter
,它也会关闭MemoryStream
(我第一次测试它时,我在MemoryStream
using块中的StreamWriter
块中使用块,然后尝试访问一个关闭的流时出错)
希望这至少能让你走上正确的方向
编辑
您需要在方法中初始化StreamWriter
,而不是作为字段变量
大概是这样的:
public class ImageProcessor
{
MemoryStream ms = new MemoryStream();
StreamWriter sw;
public Bitmap Rendering(string bmpPath)
{
sw = new StreamWriter(ms, System.Text.Encoding.UTF8);
}
}
您是如何确定它对于StringBuilder
来说太大的?唯一的。@ErikPhilips我得到一个与StringBuilder
相关的“OutOfMemoryException”,为什么不使用MemoryStream
,然后当用户决定保存它时,将它保存到一个文件中?@Tim我该怎么做?你能给我看看答案选择中的代码段吗?你没有提到框架版本,但从4.0版开始,.net framework不再需要内存流、字符串生成器实例来使用连续内存。从4.0Hello Tim开始,您可以很容易地在运行良好的旧版本上遇到内存不足的情况。感谢您花费的所有时间和精力,您的代码看起来可以正常工作。唯一的问题是StreamWriter
不是公共的,MemoryStream
也是如此。我需要能够在一个方法中将它添加到内存中,然后在另一个方法中保存。这些方法在同一个类中吗?如果是这样,则使用StreamWriter
和MemoryStream
类级别变量。如果它们在不同的类中,另一个选择是仍然使它们成为具有公共属性的类级变量以公开它们。第三种选择是将所有逻辑移到一个单独的类中,该类由应用程序中的其他类使用。我尝试过这样做,但是我不能再使用StreamWriter sw=new StreamWriter(ms,System.Text.Encoding.UTF8)代码>因为软件是未定义的,即使在它上面定义了。你能用代码更新你的问题吗?我很难想象你想要描述什么。检查上面。谢谢。