【问题标题】:StringBuilder - read N characters [closed]StringBuilder - 读取 N 个字符 [关闭]
【发布时间】:2014-12-28 18:21:24
【问题描述】:

我正在处理巨大的字符串(100MB 的文件 - 文本)。文件文本存储在 StringBuilder 中。

出于某种原因,我需要更改此文本的编码,以前不能指望这一点,从 CURRENT-Encoding 到 NEW-Encoding。所以,我需要使用

Encoding.Convert(...)

功能。由于这个文件很大,我想把它分成几部分。例如,每次 1024 个字符。将 StringBuilder 分解为子字符串对我来说似乎是个问题,因为我不想使用

.ToString()

功能(性能原因)。

您如何建议我这样做,而不是将整个文本集中到一个字符串中?

【问题讨论】:

  • 你可以使用StringReader。
  • 您认为将字符串拆分成块在性能方面有什么好处?您仍然需要转换整个字符串,对吧?
  • 你在说什么样的编码?字符是否可以具有可变长度(例如 UTF-8 与 ASCII 以外的字符或 UTF-16 与 BMP 以外的字符)?

标签: c# string performance substring


【解决方案1】:

只需使用 StreamReader,您就可以流式传输文件(而不是一次完全读取文件)并使用指定的编码将读取的字符写回新文件:

string sourcePath = "...";
string destinationPath = "...";
Encoding sourceEncoding = Encoding.UTF16;
Encoding destinationEncoding = Encoding.UTF8;

char[] readBuffer = new char[1024];
int bytesRead;

using (var writer = new StreamWriter(destinationPath, false, destinationEncoding))
{
    using (var reader = new StreamReader(sourcePath, sourceEncoding))
    {
        while ((bytesRead = reader.Read(readBuffer, 0, readBuffer.Length)) > 0)
        {
            writer.Write(buffer, 0, bytesRead);
        }
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多