2014-11-01 137 views
0

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

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

Encoding.Convert(...) 

函数。由于这个文件是HUGH,我想把它分解成几部分。例如,每次有1024个字符。打破StringBuilder的子串的似乎是一个问题,对我来说,因为我不想使用

.ToString() 

功能(性能原因)。

你如何推荐我这样做,而不需要把整个文本放到一个单独的字符串中?

+0

你可以使用['StringReader'](http://msdn.microsoft.com/en-us/library/system.io.stringreader.aspx)。 – Styxxy 2014-11-01 18:26:22

+1

你看到在分块中分割字符串的性能方面有什么好处?你仍然需要转换整个字符串,对吧? – Yogu 2014-11-01 18:26:43

+0

你在说什么样的编码?字符的长度是否可变(例如,UTF-8的字符超出ASCII或UTF-16的字符超出BMP范围)? – svick 2014-11-01 18:28:44

回答

3

只需使用一个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); 
     } 
    } 
} 
+1

你不应该也指定源编码吗? – svick 2014-11-01 18:40:09

+1

@svick你是对的,谢谢,修正。该文档声称['StreamReader(字符串)'构造函数默认为UTF8](http://msdn.microsoft.com/en-us/library/f2ke0fzy(v = vs.110).aspx),我认为它读取BOM并做了一些猜测 - 猜我错了。 – CodeCaster 2014-11-01 18:42:06

+0

看来这就是['StreamReader(string path,bool detectEncodingFromByteOrderMarks)'](http://msdn.microsoft.com/en-us/library/9y86s1a9)。尽管您不能总是依赖BOM,尤其是使用传统的非Unicode编码。 – svick 2014-11-01 18:46:18

相关问题