所有的文件操作的父类都是Stream类
一般情况我们使用File,FileStream,StreamReader/StreamWrite,GZipStream来对文件进行操作
其中FileStream用来读取大的文件,高清电影等
File用来读取小的文本文件等
StreamReader/StreamWrite用来操作大的文本文件
GZipStream压缩流,实际是对流的进行操作进行压缩和解压
使用FileStream拷贝大文件
在进行大文件操作的时候,比如说高清电影等,需要进行循环读取与写入
每次读取一部分,然后把这部分写入到新的文件,然后继续从上次的文职继续读写
直到整个文件读写完成
FileStream创建方式
//FileStream fs = File.Open();
//FileStream fs1 = File.OpenRead();//返回只读的FileStream
//FileStream fs2 = File.OpenWrite();//返回只写的FileStream
//FileStream fs3 = new FileStream();
拷贝大文件的示例:
public static void GetCopy()
{
//需要拷贝的文件
string pathFrom = @"C:\Users\Administrator\Desktop\test\练习用文件\1.avi";
//拷贝到哪里
string pathTo = @"C:\Users\Administrator\Desktop\test\练习用文件\2.avi";
//用来存放读取的文件缓存
byte[] beffer = new byte[1024 * 1024 * 3];
//创建一个读的文件流
using (FileStream fReader = new FileStream(pathFrom, FileMode.OpenOrCreate, FileAccess.Read))
{
//创建一个写的数据流
using (FileStream fWrite = new FileStream(pathTo, FileMode.OpenOrCreate, FileAccess.Write))
{
//开始第一次读取
int r = fReader.Read(beffer, 0, beffer.Length);
//如果读取到的字节数大于0,则说明还没有读完
while (r > 0)
{
//吧读取到的字节写入文件
fWrite.Write(beffer, 0, r);
//读取的进度
double d = (fReader.Position / (double)fReader.Length) * 100;
Console.WriteLine("{0:N2}", d);
//继续读取下一次
r = fReader.Read(beffer, 0, beffer.Length);
}
}
}
}
使用File来操作小的文本文件
但是File在读取的时候会一次性吧整个文件全部读取到内存中去
如果文件比较大则会占用太大的内存空间,甚至导致内存的崩溃
File的这个特性限制了他只能操作小的文本文件,而不适合操作大的文本文件
File.ReadAllLines
FileStream虽然也能读取大的文本文件
但是如果在需要读取一部分就输出显示或者其他操作的时候
应为中文站连个字节,英文占一个字节,可能会导致中文被截断,这时候会导致编码解析错误
所以在对大的文本文件进行操作的时候,可以使用StreamReader和StreamWrite来进行读写
如下示例:
/// <summary>
/// StreamReader用来读取大的文本文件
/// 防止一次读取太大的文本文件导致内存报错
/// </summary>
public static void GetFile()
{
string path = @"C:\Users\Administrator\Desktop\test\1.txt";
//StreamReader 逐行读取
using (StreamReader sr = new StreamReader(path, Encoding.Default))
{
////判断是否到了文档末尾,如果到了末尾则不再继续循环
//while (!sr.EndOfStream)
//{
// Console.WriteLine(sr.ReadLine());
//}
//判断读取的内容是不是为null,如果为null则不再继续循环
string line = null;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
string path2 = @"C:\Users\Administrator\Desktop\test\2.txt";
using (StreamWriter sw = new StreamWriter(path2, true, Encoding.Default))
{
for (int i = 0; i < 100; i++)
{
sw.WriteLine(i);
}
}
}
GZipStream压缩流压缩和解压文本文件的示例:
/// <summary>
/// 对文本文件进行压缩和解压缩
/// </summary>
public static void GetGZip()
{
//需要压缩的文本文件
string fileNmae = @"C:\Users\Administrator\Desktop\test\练习用文件\1.txt";
string zipName = @"C:\Users\Administrator\Desktop\test\练习用文件\11.txt";
string fileName2 = @"C:\Users\Administrator\Desktop\test\练习用文件\111.txt";
//压缩
//创建读取文本文件的流
using (FileStream fRead = new FileStream(fileNmae, FileMode.OpenOrCreate, FileAccess.Read))
{
//创建写入文件的流
using (FileStream fWrite = new FileStream(zipName, FileMode.OpenOrCreate, FileAccess.Write))
{
//根据写入流创建压缩流
using (GZipStream gzip = new GZipStream(fWrite, CompressionMode.Compress))
{
//存储读取的信息
byte[] beffer = new byte[1024 * 1];
//每次读取的实际长度
int len = 0;
//使用读取流来读取
while ((len = fRead.Read(beffer, 0, beffer.Length)) > 0)
{
//如果本次读取到了信息
//则通过压缩流写入文件
gzip.Write(beffer, 0, len);
}
}
}
}
//解压缩
//判断压缩文件是不是存在,如果存在解压缩
if (File.Exists(zipName))
{
//创建读取文本文件的流
using (FileStream fRead = new FileStream(zipName, FileMode.OpenOrCreate, FileAccess.Read))
{
//创建写入文件的流
using (FileStream fWrite = new FileStream(fileName2, FileMode.OpenOrCreate, FileAccess.Write))
{
//根据读取流创建压缩流
using (GZipStream gzip = new GZipStream(fRead, CompressionMode.Decompress))
{
//存储读取的信息
byte[] beffer = new byte[1024 * 1];
//每次读取的实际长度
int len = 0;
//使用压缩流来读取
while ((len = gzip.Read(beffer, 0, beffer.Length)) > 0)
{
//如果本次读取到了信息
//则通过写入流写入文本文件
fWrite.Write(beffer, 0, len);
}
}
}
}
}
}