【问题标题】:Placing a string in memory and saving it later将字符串放入内存并稍后保存
【发布时间】:2023-03-17 09:48:02
【问题描述】:

我有一个程序会创建一个巨大的字符串,对于 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
    }
}

`

【问题讨论】:

  • 你如何确定它对于StringBuilder 来说太大了?唯一的limiation on StringBuilder is IntMax (2.1GB)
  • @ErikPhilips 我收到与StringBuilder 相关的“OutOfMemoryException”
  • 为什么不使用MemoryStream,然后当用户决定保存时,将其保存到文件中?
  • @Tim 我该怎么做呢?你能告诉我答案选择中的 sn-p 吗?
  • 你没有提到框架版本,但是从 4.​​0 版开始,.net 框架不再需要内存流,字符串生成器实例使用连续内存。在从 4.0 开始运行良好的旧版本上,您可以很容易地遇到内存不足的情况

标签: c# string performance memory streamwriter


【解决方案1】:

这是一个可以帮助你的代码 sn-p。我刚刚在 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 写入带有@987654326 的文件@ 方法(接受Stream)。

小心你如何构建事物——如果你关闭StreamWriter,它也会关闭MemoryStream(我第一次测试这个时,我在using块内有StreamWriter@987654332 @ using 块,然后尝试访问已关闭的流时出错)。

希望这至少能让你朝着正确的方向前进。

编辑

您需要在方法中初始化StreamWriter,而不是作为字段变量。

类似这样的:

public class ImageProcessor
{

    MemoryStream ms = new MemoryStream();
    StreamWriter sw;

    public Bitmap Rendering(string bmpPath)
    {

        sw = new StreamWriter(ms, System.Text.Encoding.UTF8);
    }
}

【讨论】:

  • 你好,蒂姆。感谢您所有的时间和精力,您的代码看起来可以正常工作。唯一的问题是StreamWriter 不是公开的,MemoryStream 也是如此。我需要能够以一种方法将其添加到内存中,然后保存在另一种方法中。
  • 方法是否属于同一类?如果是这样,请创建 StreamWriterMemoryStream 类级别变量。如果它们在不同的类中,另一种选择是仍然使它们具有公共属性的类级变量以公开它们。第三种选择是将所有这些逻辑移动到一个单独的类中,供应用程序中的其他类使用。
  • 我试过了,但后来我不能再使用StreamWriter sw = new StreamWriter(ms, System.Text.Encoding.UTF8);,因为 sw 是未定义的,即使在它上面定义了。
  • 你能用代码更新你的问题吗?我很难想象您要描述的内容。
  • 检查上面。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 2012-03-09
  • 1970-01-01
相关资源
最近更新 更多