我有一个很大的文本文件,例如约1 GB。我只需要阅读100个前几个字符就可以了。
我搜索了StackOverflow和其他论坛,但所有论坛都有一些解决方案,它们首先读取整个文件,然后返回文件的n个字符。
我不想读取整个文件并将其加载到内存等中,只需要第一个字符即可。
答案 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的数据读取到内存中确实会浪费客户端系统-首选的选择是对其进行优化,以使您一次都不需要整个文件。