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

时间:2018-10-02 07:50:43

标签: c#

我有一个很大的文本文件,例如约1 GB。我只需要阅读100个前几个字符就可以了。

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

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

3 个答案:

答案 0 :(得分: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;
    }
}

请注意,这假设您的文件具有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;
    }
}

您可能会这样打电话:

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));
        }
    }
}

答案 1 :(得分:3)

让我们读StreamReader

  char[] buffer = new char[100];

  using (StreamReader reader = new StreamReader(@"c:\MyFile.txt")) {
    // Technically, StreamReader can read less than buffer.Length characters
    // if the file is too short; 
    // in this case reader.Read returns the number of actually read chars
    reader.Read(buffer, 0, buffer.Length);
  }

答案 2 :(得分:2)

fs.Read();不会一次读取全部字节,而是读取一些字节并返回读取的字节数。 MSDN很好地说明了如何使用它。

http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx

将全部1 GB的数据读取到内存中确实会浪费客户端系统-首选的选择是对其进行优化,以使您一次都不需要整个文件。