在C#中读取20GB以上的大文件,建议使用流(Stream)来读取,以避免一次性加载整个文件到内存中而导致内存不足的问题。
以下是一种使用流来读取大文件的示例代码:
using (FileStream fs = new FileStream(@"C:\path\to\large\file.txt", FileMode.Open, FileAccess.Read))
{
using (BufferedStream bs = new BufferedStream(fs))
{
using (StreamReader sr = new StreamReader(bs))
{
string line
while ((line = sr.ReadLine()) != null)
{
// 处理每一行数据的逻辑
}
}
}
}
在这个代码示例中,我们使用了三个流对象:
FileStream:用于打开大文件并将其作为输入流
BufferedStream:用于加快数据的读取速度,通过使用一个内部缓存来减少对硬盘的读取次数
StreamReader:用于按行读取文本数据
在while循环中,我们可以处理每一行数据的逻辑。由于只读取了一行数据,因此内存占用较小,可以避免因为文件过大导致内存溢出的问题。
需要注意的是,在处理大文件时,为了保证性能,最好使用异步读取方式。这可以通过将StreamReader对象的ReadLine方法替换为异步版本ReadLineAsync来实现。
常见并常用的stream一共有文件流(FileStream),
内存流(MemoryStream),
压缩流(GZipStream),
加密流(CrypToStream),
网络流(NetworkStream);
1.文件流(读取文件流-输出文件流)FileStream
using(Streamstreamwrite=new FileStream(@"D:\BaiduYunDownload\45.avi",FileMode.OpenOrCreate))
{
using (Stream streamread = new FileStream(@"D:\BaiduYunDownload\xiawu3.avi", FileMode.Open))
{
byte[] ss=new byte[1024*1024*4]
int len
while ((len = streamread.Read(ss, 0, ss.Length)) >0)
{
streamwrite.Write(ss, 0, len)
Thread.Sleep(1000)
}
}
}
2. 内存流(MemoryStream)
string strtxt="dasdfdsfsd"
byte[] bytetxt = Encoding.UTF8.GetBytes(strtxt)
Stream memstream = new MemoryStream()
memstream.Write(bytetxt, 0, bytetxt.Length)
3.压缩流(GZipStream),
压缩:
string s = "dfdfdf"
using (FileStream filestream = File.OpenWrite(@"c:\2.txt"))
{
using (GZipStream zipstream = new GZipStream(filestream, CompressionMode.Compress))
{
byte[] bytes = Encoding.UTF8.GetBytes(s)
zipstream.Write(bytes, 0, bytes.Length)
}
}
解压:
using (FileStream filestream = File.OpenRead(@"c:\2.txt"))
{
using (GZipStream zipstream = new GZipStream(filestream, CompressionMode.Decompress))
{
using (FileStream filestreamwrite = new FileStream(@"c:\3.txt", FileMode.OpenOrCreate))
{
byte[] bytes = new byte[1024 * 1024 * 4]
int length
while ((length = zipstream.Read(bytes, 0, bytes.Length)) >0)
{
filestreamwrite.Write(bytes, 0, length)
}
}
}
}
System.Net.WebClient c = new System.Net.WebClient()byte[] b = c.DownloadData( "http://www.aa.com/aa.doc ")System.IO.MemoryStream ms = new System.IO.MemoryStream()ms.Write(b, 0, b.Length)欢迎分享,转载请注明来源:内存溢出
评论列表(0条)