【问题标题】:Count actual bytes had been read计数实际字节已被读取
【发布时间】:2019-01-14 21:52:45
【问题描述】:

我正在解析一个大文件,我喜欢通过显示已读取的字节数来监控该过程。 实际代码量很大,但这部分是我计算的。

StreamReader sr =  new StreamReader(FilePath);
        while ((line = sr.ReadLine()) != null )
        {
            //do parsing jobs

            byteCnt += Convert.ToUInt64( line.Length * sizeof(char) );
        }

 Console.WriteLine(String.Format("{0:n0}", byteCnt) + "  Bytes");

文件为 16.9 GB(18,186,477,492 字节)

但我的程序有 34,816,805,164 字节

怎么会这样?以及如何让这个数字更合理?

谢谢

【问题讨论】:

  • 提示:什么是 sizeof(char)?为什么这对于文件可能不正确(不是没有代理对的 UTF-16)?请注意,大约有 2 倍的差异。现在,查看 ReadLine 文档,了解缺失的差异在哪里:“返回的字符串不包含..”
  • 会出现细微差别,因为ReadLine 删除了新行和回车字符。所以你每行会丢失两个字符。正如@user2864740 提到的,您可以检查文件的编码。作为替代方案,您可以尝试sr.BaseStreamPosition 属性。然而,这可能会根据流而抛出。

标签: c# io byte streamreader


【解决方案1】:

sizeof(char) 在 C# 中为 2,因为它使用 unicode 编码。如果您的文件不是 Unicode,这将不是一个准确的衡量标准。您可以改为使用例如

System.Text.ASCIIEncoding.ASCII.GetByteCount(line);
// or another example:
Encoding.UTF8.GetByteCount(line);

获取大小。您需要根据文件的编码选择合适的解决方案。

【讨论】:

  • 正如 Pretasoc 提到的,“位置”可能很有用,即使它需要底层流曝光。
猜你喜欢
  • 2012-07-25
  • 2019-09-04
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
相关资源
最近更新 更多