使用UDE进行字符集检测并将文本转换为字符串 - 对性能产生影响

时间:2014-11-08 21:11:48

标签: c# encoding

我很好奇一件事。我使用以下代码打开文件并使用正确的编码读取它 - 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);

欢迎任何想法或建议,谢谢!

1 个答案:

答案 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);