2014-11-01 134 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

相關問題