我很好奇一件事。我使用以下代码打开文件并使用正确的编码读取它 - UDE是Mozilla Universal Charset Detector 1.1.0。我不知道输入字符串文件是什么,但我可以尝试猜测。
但是,我做了两次相同的事情 - 首先我需要从文件创建文件流,因为这是UDE接受的,然后我需要将内容放入要处理的字符串中。我尝试将文件流转换为流式读取器,然后转换为字符串,但这会弄乱行的顺序。
所以,我最终得到File.ReadAllText(sttFile, enc);
,我想知道这是否可以更好/更快地完成,以及在数百个大型文本文件的情况下对性能的影响。
FileStream fs = File.OpenRead(sttFile);
Ude.CharsetDetector cDet = new Ude.CharsetDetector();
cDet.Feed(fs);
cDet.DataEnd();
Encoding enc = Encoding.UTF8;
try
{
enc = Encoding.GetEncoding(cDet.Charset);
}
catch (Exception ex)
{
Console.WriteLine("Failed to obtain encoding of the file to {0}. Corrupted characters may occur.", cDet.Charset);
}
//this messes up the lines order??
//StreamReader sr = new StreamReader(fs, enc);
//string fileContent = sr.ReadToEnd();
string fileContent = File.ReadAllText(sttFile, enc);
欢迎任何想法或建议,谢谢!
答案 0 :(得分:1)
与其他事物相比,再次打开文件所需的时间可以忽略不计。所以我不担心。您的目标应该是编写最清晰的代码,除非性能是实际的,测量的关注点。在这种情况下,最清楚的是File.ReadAllText
。
如果您真的想重用流,只需将fs.Position
重置为0。
最后,您应该在using
周围添加File.OpenRead
子句,以保证文件关闭。您的当前代码可能会将其打开,除非UDE关闭它(我怀疑它确实如此)。具体做法是:
var enc = Encoding.UTF8;
using (var fs = File.OpenRead(sttFile))
{
... rest of the code ...
}
string fileContent = File.ReadAllText(sttFile, enc);