我有一个非常大的文本文件,例如大约1 GB.我只需阅读100个第一个字符,仅此而已.
我搜索了StackOverflow和其他论坛,但他们都有一些解决方案,首先读取整个文件,然后将返回该文件的一些n个字符.
我不想读取并将整个文件加载到内存等只需要第一个字符.
您可以使用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)
| 归档时间: |
|
| 查看次数: |
1278 次 |
| 最近记录: |