文件流以及如何限制文件流的大小

175 阅读2分钟
FileStream操作字节的(可以操作任意类型的文件,因为所有文件都最终都以字节的形式来进行存储) 然而StreamReader与StreamWriter是操作字符

//使用StreamWriter写入一个文件 
//参数2 默认值fasle 不写默认覆盖 写true会追加到文本后面 
//using (StreamWriter sw = new StreamWriter(@"C:\Users\Administrator\Desktop\练习4.txt", true)) 
//{ 
// 
// 写入内容 
// sw.WriteLine("fhfgjhfgg", Encoding.ASCII);
//}
//using (FileStream students = new FileStream(@"C:\Users\Administrator\Desktop\学生档案.txt", FileMode.OpenOrCreate, FileAccess.Write))
//{ // for (int i = 0; i < 2; i++)
// { // Console.WriteLine("请输入学生的信息:"); 
// Console.Write("年龄:"); 
// int age = int.Parse(Console.ReadLine());
// Console.Write("姓名:"); 
// string name = Console.ReadLine();
// Console.Write("性别:");
// string sex = Console.ReadLine();
// Console.Write("班级:"); 
// string cla = Console.ReadLine();
// Console.Write("爱好:"); 
// string hobby = Console.ReadLine();
// byte[] buffer = Encoding.UTF8.GetBytes(age+"\n"+name + "\n" +sex + "\n" +cla + "\n" +hobby);
// students.Write(buffer, 0, buffer.Length);
// } 
// 
//} //StreamReader ST = new StreamReader(@"C:\Users\Administrator\Desktop\学生档案.txt", Encoding.UTF8); 
//Console.WriteLine(ST.ReadToEnd());
//ST.Close();
//ST.Dispose();
//Console.ReadLine();

1、使用FileStream来读取数据 
//参数1、文件路径 
//参数2、操作文件的方式 
//参数3、文件流对象如何访问该文件 例子:FileStream fs = new FileStream(@"path路径",FileMode.OpenOrCreat,FileAccess.Read); 
Open:打开 文件不存在会抛出异常;
OpenOrCreat:打开或者创建 文件不存在会创建;
Creat:创建 如果存在就会覆盖
CreatNew:创建 如果存在会抛异常
Append:追加 文件不存在就会创建

2、限制读取数据的大小 
//1024 byte =1Kb; 
//1024 kb = 1Mb;
byte [] buffer = new bute[1024*1024*5];(不可以随便写,要有上限,不能设置的太大)
//使用Read进行读取
//需要一个字节数组给多大就读多大,从而限制不会一次全都读出来
//参数1:从数据流中读取的数据的大小 
//参数2:从哪个字节开始读取
//参数3:读取的字节总数 int n = fs.Read(buffer,0,buffer.Length);
//返回读取到的有效字节数 
//虽然GC非常强大,但并不是所有的资源都可以被回收的几个集合,其中就会有文件流
<1> 关闭文件流:fs.Close(); 
<2> 释放文件流所占用的内存资源:fs.Dispose();

//现在所有的数据都在字节数据当中,人看不懂,需要将其转换按照字节对应的字符编码解码为 字符串。
<1> String s = Encoding.UTF8.GetString(buffer,0,buffer.Length);
<2> String s =Encoding.UTF8.GetString(buffer,0,n); 
//第二个这里为什么不使用buffer.Length来设置读取的数据大小???
因为啊,此时是把数据为5MB的字符串,而当文本的实际不够5MB,此时会将多出来的部分使用空格去填充到5MB 需要在解码时去读取有效字节的码数,以防止发生此类的情况 
//直接输出 Console.WriteLine(s);