C# 是否支持只从一个txt的多少字节后开始读,并且仅向后读多少个字节 ? 文件巨大
C# 是否支持只从一个txt的多少字节后开始读,并且仅向后读多少个字节 ? 文件巨大,单个6GB左右,如果正常File.ReadAllText,内存要爆炸了。但因为文件按自己设定格式写入的。每次要读的时候,知道应该从第几个字节读,读多少个长度所以问此问题。请各位大佬看看这个问题有解么?但不用提供其他方案,比如写数据库之类的。甲方老项目要求,不支持修改原本方案 可以逐行读取,
StreamReader sr = new StreamReader(path, Encoding.Default);
string line;
while ((line = sr.ReadLine()) != null)
{
//逐行读取
}
sr.Close(); 可以考虑截取相应的长度存入数据库,然后读取出来后处理呢 控制一下 开始位置和读取长度不就解决了
using System.IO;
class Program
{
//循环读取大文本文件
static void Main(string[] args)
{
FileStream fsRead;
string filePath="C:\\Users\\filedemo.txt"; //获取文件路径
try
{
fsRead = new FileStream(@filePath,FileMode.Open);//用FileStream文件流打开文件
}
catch (Exception)
{
throw;
}
long leftLength = fsRead.Length;//还没有读取的文件内容长度
byte[] buffer = new byte; //创建接收文件内容的字节数组
int maxLength=buffer.Length;//每次读取的最大字节数
int num=0;//每次实际返回的字节数长度
int fileStart=0;//文件开始读取的位置
while (leftLength>0)
{
fsRead.Position=fileStart;//设置文件流的读取位置
if (leftLength<maxLength)
{
num=fsRead.Read(buffer,0,Convert.ToInt32(leftLength));
}
else{
num=fsRead.Read(buffer,0,maxLength);
}
if (num==0)
{
break;
}
fileStart += num;
leftLength -= num;
Console.WriteLine(Encoding.Default.GetString(buffer));
}
Console.WriteLine("end of line");
fsRead.Close();
Console.ReadKey();
}
} using FileStream fs = File.OpenRead(@"e:\desktop\5.md");
fs.Seek(100, SeekOrigin.Begin); //设置要开始读取的位置,文件开头100个字节以后的地方开始
byte[] buffer = new byte;
int recvSize = fs.Read(buffer, 0, 1024);
Console.WriteLine(Encoding.Default.GetString(buffer)); hackgsl 发表于 2022-6-19 23:37
可以逐行读取,
StreamReader sr = new StreamReader(path, Encoding.Default); ...
不行,读到指定行,就走几百万行,纯属浪费资源。况且,根本不是按行分隔。而是128KB对应1个自定义数据 TakeKeyEasy 发表于 2022-6-20 00:16
可以考虑截取相应的长度存入数据库,然后读取出来后处理呢
请看题目,说了不能数据库 感谢4楼和5楼。但问下,这样一开始File.read,不会把文件都读取是么 4#给出了方案,以二进制方式读取,打开文件后指定要偏移的位置 murder2008 发表于 2022-6-20 08:40
4#给出了方案,以二进制方式读取,打开文件后指定要偏移的位置
文本怎么处理? 一开始以为客户那边说每个数据128KB是定死的
结果刚才又说不行,因为是文本信息(且没有换行,而是用自定义的|作为数据分隔符)
那这样的话,没法准确知道是哪个位置
只能粗略取出那个位置,但是如何将那个位置的二进制变成文字(UTF-8)呢?关键是找到的那个位置,不一定是一个字符的开始,一个字符UTF-8是1--3字节,不一定一开始定位到哪个字节了