读取大文本文件的第一个字符 - C#

Ins*_*Man 2 c#

我有一个非常大的文本文件,例如大约1 GB.我只需阅读100个第一个字符,仅此而已.

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

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

Mat*_*son 6

您可以使用StreamReader.ReadBlock()从文件中读取指定数量的字符:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这假定您的文件具有UTF8编码.如果没有,则需要指定正确的编码(在这种情况下,您可以添加编码参数ReadChars()而不是硬编码).

使用ReadBlock()而不是Read()阻止直到读取了所有字符或者已经到达文件末尾的优点.然而,对于FileStream这一点并不重要; 请注意Read(),即使没有到达流的末尾,也可以返回比一般情况下要求的更少的字节数.

如果你想要一个async版本,你可以ReadBlockAsync()像这样调用:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能会这样称呼:

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)