C# 读取大文本文件的前n个字符-C

C# 读取大文本文件的前n个字符-C,c#,C#,我有一个非常大的文本文件,例如大约1GB。我只需要读100个开头的字符就行了 我搜索了StackOverflow和其他论坛,但它们都有一些解决方案,首先读取整个文件,然后返回文件中的一些n字符 我不想读取整个文件并将其加载到内存等。只需要第一个字符。让我们使用StreamReader读取: 您可以使用从文件中读取指定数量的字符: public static char[] ReadChars(string filename, int count) { using (var stream =

我有一个非常大的文本文件,例如大约1GB。我只需要读100个开头的字符就行了

我搜索了StackOverflow和其他论坛,但它们都有一些解决方案,首先读取整个文件,然后返回文件中的一些n字符

我不想读取整个文件并将其加载到内存等。只需要第一个字符。

让我们使用StreamReader读取:

您可以使用从文件中读取指定数量的字符:

public static char[] ReadChars(string filename, int count)
{
    using (var stream = File.OpenRead(filename))
    using (var reader = new StreamReader(stream, Encoding.UTF8))
    {
        char[] buffer = new char[count];
        int n = reader.ReadBlock(buffer, 0, count);

        char[] result = new char[n];

        Array.Copy(buffer, result, n);

        return result;
    }
}
注意,这假设您的文件具有UTF8编码。如果没有,则需要指定正确的编码,在这种情况下,可以向ReadChars添加编码参数,而不是对其进行硬编码

使用ReadBlock而不是Read的优点是,它会一直阻塞,直到读取完所有字符或到达文件末尾为止。但是,对于文件流来说,这并不重要;请注意,读取返回的字节数可能比一般情况下要求的字节数少,即使尚未到达流的结尾

如果您想要异步版本,可以调用ReadBlockAsync,如下所示:

财政司司长:雷德;不会一次读取全部字节,而是读取一些字节数并返回读取的字节数。MSDN有一个很好的例子说明了如何使用它


将整个1GB的数据读入内存确实会消耗客户机的系统—首选的方法是对其进行优化,这样您就不需要一次完整地使用整个文件。

读取每个字节并将其转换为字符可能的重复,可能的重复取决于您的编码。您需要读取Encoding.GetMaxByteCountn字节,让编码器将字节编码为字符,然后选择第一个n;StringReader实际上是从字符串中读取的,不是吗?@Marc Gravell:你说得很对;我很抱歉输入错误,请注意阅读-在某些情况下,它返回的字符可能比要求的少,即使有更多可用字符,因为它不会阻塞。但是,对于文件,这应该可以。这就是Microsoft添加ReadBlock方法的原因。还要注意长度小于100个字符的文件-在这种情况下,此方法将在数组末尾保留一个或多个0字符,这可能是正常的,也可能是不正常的。如果OP希望读取n个字符,而不是n个字节,则无法工作,并且在UTF8中,一个字符最多可以是6个字节。正如我在评论中提到的,您需要调用GetMaxByteCount进行编码。我现在明白了,我的错。
public static char[] ReadChars(string filename, int count)
{
    using (var stream = File.OpenRead(filename))
    using (var reader = new StreamReader(stream, Encoding.UTF8))
    {
        char[] buffer = new char[count];
        int n = reader.ReadBlock(buffer, 0, count);

        char[] result = new char[n];

        Array.Copy(buffer, result, n);

        return result;
    }
}
public static async Task<char[]> ReadCharsAsync(string filename, int count)
{
    using (var stream = File.OpenRead(filename))
    using (var reader = new StreamReader(stream, Encoding.UTF8))
    {
        char[] buffer = new char[count];
        int n = await reader.ReadBlockAsync(buffer, 0, count);

        char[] result = new char[n];

        Array.Copy(buffer, result, n);

        return result;
    }
}
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;

namespace Demo
{
    static class Program
    {
        static async Task Main()
        {
            string filename = "Your filename here";
            Console.WriteLine(await ReadCharsAsync(filename, 100));
        }
    }
}