如何获取流/文件的字符长度(不是字节)?假设文件/流的编码是已知的(在运行时)。
我宁愿不将整个流加载到内存中,所以我反对使用TextReader.ReadToEnd()
如何获取流/文件的字符长度(不是字节)?假设文件/流的编码是已知的(在运行时)。
我宁愿不将整个流加载到内存中,所以我反对使用TextReader.ReadToEnd()
除非编码是固定宽度的(每个字符的字节数相同 - 例如 ASCII 但不是 UTF-8),否则您需要读取整个文件 - 但它不需要在内存中。例如:
public long CountCharacters(TextReader reader)
{
char[] buffer = new char[8 * 1024];
long total = 0;
int charsRead;
while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
{
total += charsRead;
}
return total;
}
像这样使用:
using (var reader = File.OpenText("file.txt", Encoding.UTF8))
{
Console.WriteLine(CountCharacters(reader));
}
请注意,这将计算 UTF-16 代码单元,这与 Unicode 字符或可显示字形不太一样,但在大多数情况下它已经足够好了。(考虑组合字符和代理对等情况。)
这是我到目前为止所拥有的:
Stream stream = file.OpenRead("file.txt");
Encoding encoding = Encoding.Default; //or whatever
TextReader reader = new StreamReader(stream, encoding);
var buf = new char[4096];
long total=0;
long crt;
while ((crt = reader.Read(buf, 0, 4096)) > 0)
{
total += crt;
}
return total;
这取决于编码。如果它是固定长度编码,则将字节长度除以字符大小,如果它是可变长度编码,则在处理文件之前不知道。