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)因为软件是未定义的,即使在它上面定义了。你能用代码更新你的问题吗?我很难想象你想要描述什么。检查上面。谢谢。