在.NET中,高效读取大文件的内容可以通过使用FileStream
以及逐行或逐块读取的方式来降低内存消耗。以下是分别读取大文本文件和大JSON文件的示例,以及它们的优点:
using System;
using System.IO;
using System.Text;
class Program
{
static void Main()
{
string filePath = "path/to/your/largeTextFile.txt";
// 使用FileStream打开文件,指定FileShare.ReadWrite以允许多个读取器同时访问文件
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
// 使用StreamReader逐行读取文件内容
using (StreamReader reader = new StreamReader(fileStream, Encoding.UTF8))
{
string line;
while ((line = reader.ReadLine()) != null)
{
// 在这里处理每一行的数据,可以输出到控制台或进行其他操作
Console.WriteLine(line);
}
}
}
}
}
优点:
FileStream
和逐行读取方式,不需要一次性加载整个文件到内存中。FileShare.ReadWrite
,允许其他读取器或写入器同时访问文件。using System;
using System.IO;
using Newtonsoft.Json;
class Program
{
static void Main()
{
string filePath = "path/to/your/largeJsonFile.json";
// 使用FileStream打开文件,指定FileShare.ReadWrite以允许多个读取器同时访问文件
using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
// 使用JsonTextReader逐行解析JSON文件
using (JsonTextReader jsonReader = new JsonTextReader(new StreamReader(fileStream)))
{
while (jsonReader.Read())
{
if (jsonReader.TokenType == JsonToken.StartObject || jsonReader.TokenType == JsonToken.StartArray)
{
// 在这里处理每一个JSON对象或数组
Console.WriteLine("Start of object or array");
}
else if (jsonReader.TokenType == JsonToken.EndObject || jsonReader.TokenType == JsonToken.EndArray)
{
// 在这里处理JSON对象或数组的结束
Console.WriteLine("End of object or array");
}
else if (jsonReader.TokenType == JsonToken.PropertyName)
{
// 在这里处理JSON属性名称
Console.WriteLine($"Property Name: {jsonReader.Value}");
}
else if (jsonReader.TokenType == JsonToken.String)
{
// 在这里处理字符串值
Console.WriteLine($"String Value: {jsonReader.Value}");
}
// 其他类型的处理可以继续扩展
}
}
}
}
}
优点:
FileStream
和逐行读取方式,不需要一次性加载整个文件到内存中。FileShare.ReadWrite
,允许其他读取器或写入器同时访问文件。请确保替换示例中的文件路径为你实际的文件路径。这两个示例都考虑了文件的共享性,允许多个读取器同时访问文件,这在某些场景下可能是有益的。