当前位置: 首页 > news >正文

14、c# IO流

1 概念

编码:把人类信息转换成机器信息 解码:把机器信息转化为人类信息 ​ io流:::in out 流::::有起始和终点的字节集合 io流:::基础类库中定义的一堆用于描述数据传输这件事情 ​ 参照物:永远是内存 内存:临时存储 用于程序的运行 硬盘:持久存储 用于数据的保存 外部存储设备:硬盘 u盘 光盘 等 ​ 读进来 写出去:::输入和读是一回事 输出和写是一会儿事 ​ 按方向分类: 输入流:把信息从外部存储设备的源文件中读到内存中 输出流:把信息从内存中写到外部存储设备的目的文件中 按传输的单位分类: 字符流:传输的基本单位是字符(同一个字符相关的字节组) 字节流:传输的基本单位是字节 按关联的对象分类 节点流:关联的对象是文件 装饰流:关联的对象是节点流 对节点流进行功能加强 ​ ​ ​ ​ 文件: 源文件: 读信息时 文件存储的位置 目的文件:写信息时 文件的存储位置 读进来 写出去 ​

2 文件类:File/FileInfo

2.1 file类

  • 主要方法

File:static类 所有成员都是静态的 1 判断是否存在: bool Exists(string) 2 创建文件 : FileStream Create(string) 3 删除文件: void Delete(string) 4 获取相关时间 DateTime GetCreationTime(string) DateTime GetLastAccessTime(string) DateTime GetLastWriteTime(string) 5 移动/重命名 void Move(string) 6 写相关的方法: void WriteAllText(fileName,text)::写一个字符串到文件中 void WriteAllLine(fileName,string[])::写多行到文件中 void WriteAllBytes(fileName,byte[])::写一个字节数组到文件中 注意:write方法可以创建文件 但不能创建文件夹 注意:write方法 如果文件已存在 删除 7 续写相关的方法 void AppendAllText(fileName,text)::续写一个字符串到文件中 void AppendAllLine(fileName,string[])::续写多行到文件中 void AppendAllBytes(fileName,byte[])::续写一个字节数组到文件中 8 读相关的方法 string ReadAllText(fileName):读取文件 获取一个字符串 string[] ReadAllLine(fileName):读取文件 获取一个字符串数组 一行一个字符串 byte[] ReadAllBytes(fileName):读取文件 获取一个字节数组
  • 测试代码

//file类相关的方法 ​ static void fileClass() { ​ //file类 Console.WriteLine("判断文件是否存在:" + File.Exists(fileName1)); //Console.WriteLine("创建文件:"+File.Create(fileName2)); //删除 File.Delete(fileName1); fileName2 = "C:/Users/miaot/Desktop/11/2.txt"; Console.WriteLine("判断文件是否存在:" + File.Exists(fileName1)); Console.WriteLine("获取文件创建时间:" + File.GetCreationTime(fileName2)); Console.WriteLine("获取文件最后一次访问时间:" + File.GetLastAccessTime(fileName2)); Console.WriteLine("获取文件最后一次写入时间:" + File.GetLastWriteTime(fileName2)); //移动 // File.Move("C:/Users/miaot/Desktop/11/a.txt", "C:/Users/miaot/Desktop/11/aa.txt"); //File.Move("C:/Users/miaot/Desktop/11/aa.txt", "D:/aaA.txt"); ​ ​ //字符和字节数组之间转换 string str = "你好吗123abc"; //把字符转换为字节 byte[] arr = UTF8Encoding.UTF8.GetBytes(str);//utf-8中 1个中文 3个字节 Console.WriteLine(arr.Length); //把字节转化为字符串 str = UTF8Encoding.UTF8.GetString(arr); Console.WriteLine(str); show(arr); ​ ​ //写相关:write:::System.IO.DirectoryNotFoundException //注意:write方法可以创建文件 但不能创建文件夹 //注意:write方法 如果文件已存在 删除 //File.WriteAllBytes("B:/Users/miaot/Desktop/11/a.txt",arr); File.WriteAllBytes("C:/Users/miaot/Desktop/11/a.txt", arr); string[] strs = { "123", "456", "abc", "苗天保" }; File.WriteAllLines("C:/Users/miaot/Desktop/11/a.txt", strs); File.WriteAllText("C:/Users/miaot/Desktop/11/a.txt", "111"); //写相关:append:::续写 File.AppendAllLines("C:/Users/miaot/Desktop/11/a.txt", strs); ​ //读 Console.WriteLine("读取文件:" + File.ReadAllText("C:/Users/miaot/Desktop/11/a.txt")); Console.WriteLine("读取文件:" + File.ReadAllLines("C:/Users/miaot/Desktop/11/a.txt")); Console.WriteLine("读取文件:" + File.ReadAllBytes("C:/Users/miaot/Desktop/11/a.txt")); } static void show(byte[] arr) { for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i]+(i==arr.Length-1?"\r\n":",")); } }

2.2 FileInfo类

  • 方法

FileInfo:::非静态类 需要实例化 new FileInfo(fileName2); 方法: 和File类完全相同:create delete move OpenRead OpenWrite Append 特有属性: string Directory;获取父文件对象 string DirectoryName;获取父文件对象的名字
  • 代码

//fileInfo类相关的方法 static void fileInfoClass() { FileInfo fileInfo = new FileInfo(fileName2); Console.WriteLine("获取父目录对象:"+fileInfo.Directory); Console.WriteLine("获取父目录对象路径:"+fileInfo.DirectoryName); }

3 文件夹类:Directory/DirectoryInfo

3.1Directory

  • 方法

Directory:文件夹 static类 方法: 判断存在 创建 删除 移动 获取时间参数 特有方法: 1 获取当前程序的文件夹:string GetCurrentDirectory() 2 获取所有的直接子文件夹:string[] GetDirectories(fileName) 3 获取所有的直接子文件:string[] GetFiles(fileName) 4 获取父目录:string GetParent(fileName)
  • 代码

//directory static void test01() { string name = "C:\\Users\\miaot\\Desktop\\33\\22\\11"; //判断存在 Console.WriteLine("判断存在::" + Directory.Exists(name)); if (!Directory.Exists(name)) { //创建文件夹 Directory.CreateDirectory(name); } //删除 Directory.Delete(name); //移动 //Directory.Move("C:\\Users\\miaot\\Desktop\\11", "C:\\Users\\miaot\\Desktop\\44"); ​ //获取父目录 Console.WriteLine("获取父目录::" + Directory.GetParent(name)); name = "C:\\Users\\miaot\\Desktop\\44"; ​ //获取所有的直接子文件 string[] files = Directory.GetFiles(name); for (int i = 0; i < files.Length; i++) { Console.WriteLine(i + ":::" + files[i]); } //获取所有的直接子文件夹 string[] dirs = Directory.GetDirectories(name); for (int i = 0; i < dirs.Length; i++) { Console.WriteLine(i + ":::::::" + dirs[i]); } //获取当前文件夹 //C:\Users\miaot\Desktop\AI视觉307\code\project01\project01\demo03_基础类库baseclass\bin\Debug Console.WriteLine("获取当前文件夹:" + Directory.GetCurrentDirectory()); }

3.2 递归

//递归::方法调用自己:::System.StackOverflowException //内存分类:栈内存:::存储临时变量+方法加载 // 堆内存::::存储对象 //注意:必须定义个结束递归的条件 否则内存溢出 static void test02() { Console.WriteLine("test02 num="+num++); // test02(); } //求1到n的和 static int geSum01(int n) { int sum = 0; for (int i =1; i <= n; i++) { sum += i; } return sum; } //求1到n的和 static int geSum02(int n) { if (n==1) { return 1; } return n + geSum02(n-1); }

3.3 自定义方法实现递归显示文件夹

//写一个方法:遍历参数字符串表示的文件/文件夹::如果是文件夹 就把其中的所有文件都遍历 static void showDir(string name) { //通过名字判断 if (name.Contains(".")) { if (!File.Exists(name)) { throw new FileNotFoundException("文件不存在!:::"+name); } Console.WriteLine("文件:::"+name); return; } //是文件夹 if (!Directory.Exists(name)) { throw new FileNotFoundException("文件夹不存在!:::" + name); } Console.WriteLine("文件夹<<<<<<<<" + name); //获取其所有的子文件 string[] files= Directory.GetFiles(name); if (files!=null && files.Length!=0) { foreach (var fileName in files) { showDir(fileName); } } //获取其所有的子文件夹 string[] dirs= Directory.GetDirectories(name); if (dirs!=null && dirs.Length!=0) { foreach (var dirName in dirs) { showDir(dirName); } } //代码的健壮性 }

3.4 自定义方法实现递归删除文件夹

//尝试写一个 删除参数文件/文件夹的方法 static void deleteAll(string name) { if (name==null || name.Trim()=="") { throw new Exception("输入的路径不正确!"); } if (name.IndexOf(".")!=-1) { if (!File.Exists(name)) { throw new FileNotFoundException("文件不存在!"+name); } File.Delete(name); Console.WriteLine(name+":::删除文件成功!"); return; } if (!Directory.Exists(name)) { throw new DirectoryNotFoundException("文件夹不存在!" + name); } //删除所有的子文件 string[] files = Directory.GetFiles(name); if (files!=null && files.Length!=0) { //删除其下面的所有子文件 foreach (string file in files) { deleteAll(file); } } //删除所有的子文件夹 string[] dirs= Directory.GetDirectories(name); if (dirs!=null && dirs.Length!=0) { //删除其下面的所有子子文件夹 foreach (string dir in dirs) { deleteAll(dir); } } //删除当前文件夹 Directory.Delete(name); }

3.5 DirectoryInfo

略 和 Directory相同 只是需要实例化

4 FileStream字节流

4.0 方法统计

FileStream:::字节流:::可以操作任意文件 1:构造方法:FileStream(fileName,FileMode,FileAccess); FileMode:枚举类::Create没有就创建有就覆盖、Open打开、CreateNew创建新的 Append追加 FileAccess枚举类::Read读 Write写 ReadWrite读写 2 读取方式: int ReadByte();一次读取一个字节 如果到达文件末尾 返回-1 int Read(arr,startIndex,count)一次读取一个字节数组 返回值:本次当前的有效字节数 如果到达文件末尾返回0 arr:用于装本次读取的有效字节的缓冲区数组 startIndex:arr中开始装信息的位置 count:arr中可以装多少个字节信息 3 写方法: void Write(arr,startIndex,count)::把arr从startIndex处开始的前count个字节 写到目的文件中 void WriteByte(byte)::把参数字节 写到目的文件中 4 关闭流 释放资源 void Close() 学习重点: 1 每种io流类的特点 FileStream::既能输入还可以输出 基本单位是字节 特点:效果低 操作文本出现乱码 可以操作所有文件 2 铁打三部:::复制

4.1 读

//读 static void read() { //1 创建流:关联文件::指定 是否创建 读或写 FileStream fs = new FileStream("C:\\Users\\miaot\\Desktop\\test\\2.txt", FileMode.Open, FileAccess.ReadWrite); //2 选择读方式:逐个字节读 //while (true) { // int n = fs.ReadByte();//到达末尾 返回-1 // if (n==-1) { // Console.WriteLine("读取完毕!"); // break; // } // Console.WriteLine(n); //} //2 选择读方式:逐个字节数组读 byte[] arr = new byte[10]; while (true) { int n = fs.Read(arr, 0, arr.Length); if (n == 0) { Console.WriteLine("到达末尾!"); break; } //返回值n:本次读取的有效字节数:::到达末尾返回-1 //参数1 arr::用于装读取的字节信息的缓冲区数组 //参数2 0:::arr的哪个位置处开始存储信息 //参数3:length:::arr中可以存储多少个字节 //Console.WriteLine("n="+n); //show(arr); Console.Write(UTF8Encoding.UTF8.GetString(arr, 0, n));//把arr从0开始 的前n个有效字节转换为字符串 //Thread.Sleep(100); } //3 关闭流 释放资源 fs.Close(); }

4.2 写

//写 private static void write() { //1 创建流:关联文件::指定 是否创建 读或写 FileStream fs = new FileStream("C:\\Users\\miaot\\Desktop\\test\\3.txt", FileMode.Append, FileAccess.Write); //2 选择写的方式:逐个字节的写 fs.WriteByte(59); fs.WriteByte(69); fs.WriteByte(99); fs.WriteByte(13); fs.WriteByte(10); fs.WriteByte((byte)'-'); byte[] arr = UTF8Encoding.UTF8.GetBytes("苗天保100分"); foreach (byte b in arr) { fs.WriteByte(b); } //2 选择写的方式:逐个字节数组的写 arr = UTF8Encoding.UTF8.GetBytes("\r\n苗天保90分"); fs.Write(arr, 0, arr.Length); //3 关闭流 fs.Close(); }

4.3 复制

//复制 private static void copy01(string yuan,string muDi) { //判断源文件是否存在 if (!File.Exists(yuan)) { throw new FileNotFoundException("文件不存在!"+yuan); } //DateTime time1 = DateTime.Now; long time1 = Environment.TickCount; //一边读 一边写 //1 创建流关联文件 FileStream fsYuan= File.OpenRead(yuan); FileStream fsMuDi=new FileStream(muDi,FileMode.Create,FileAccess.Write); //2 选择读写方式:逐个字节的读写 while (true) { int n = fsYuan.ReadByte(); if (n==-1) { Console.WriteLine("复制完毕!"); break; } fsMuDi.WriteByte((byte)n); } long time2= Environment.TickCount; Console.WriteLine(time2-time1); //3 关闭流 fsYuan.Close(); fsMuDi.Close(); } private static void copy02(string yuan, string muDi) { //判断源文件是否存在 if (!File.Exists(yuan)) { throw new FileNotFoundException("文件不存在!" + yuan); } //DateTime time1 = DateTime.Now; long time1 = Environment.TickCount; //一边读 一边写 //1 创建流关联文件 FileStream fsYuan = File.OpenRead(yuan); FileStream fsMuDi = new FileStream(muDi, FileMode.Create, FileAccess.Write); //2 选择读写方式:逐个字节的读写 byte[] arr = new byte[1024]; while (true) { int n = fsYuan.Read(arr, 0, arr.Length); if (n == 0) { Console.WriteLine("复制完毕!"); break; } fsMuDi.Write(arr,0,n); } long time2 = Environment.TickCount; Console.WriteLine(time2 - time1); //3 关闭流 fsYuan.Close(); fsMuDi.Close(); }

5 StreamReader+StreamWriter字符流

5.1 读

//字符输入流:读 static void read() { //1 创建流关联文件 StreamReader sr = new StreamReader("C:\\Users\\miaot\\Desktop\\etst/1.txt"); //2 选择读方式 //int n=sr.Read();//2.1:一次读一个字符 到达末尾返回-1 char[] arr = new char[10]; //int n= sr.ReadBlock(arr, 0, 10);/:2.2:一次读一个字符数组:从0位置处装 最多装10个 //返回值是 本次读取的有效字符数:达到末尾返回 0 //string str = sr.ReadLine();//2.3:一次一行 :如果到达文件末尾返回null string str=sr.ReadToEnd(); //2.4::一次读取整个文件 只使用小文件 Console.WriteLine(str); //3 关闭流 sr.Close(); }

5.2 写

static void write(){ //1 创建流关联文件 // StreamWriter sr1 = new StreamWriter("C:\\Users\\miaot\\Desktop\\etst/2.txt",true);//第二个参数表示是否续写 StreamWriter sw = new StreamWriter("C:\\Users\\miaot\\Desktop\\etst/2.txt"); //2 选择写方式 sw.Write('你'); //2.1 逐个字符的写 sw.Flush(); sw.Write('\r');//linux操作系统中、\r\n 在window操作系统\r\n 或者\n sw.Write('\n'); sw.Flush(); sw.WriteLine("一次写一行1");//2.2 逐行写::写完字符串 加一个换行符 sw.Flush(); sw.WriteLine("一次写一行2"); sw.WriteLine("一次写一行3"); sw.Flush(); sw.Write('你'); // sw.Flush(); //字符流为了保证 写入的信息是完整字符:需要在内存中创建一个缓冲区 对同一个字符的多个字节进行打包:Write方法是内存中的信息打包到缓冲区 // Flush方法用于把缓冲区中的信息刷新到目的文件 //一般是一次write 一次flush 计时清空缓冲区 //3 关闭流 sw.Close();//关闭时 会自动刷新缓冲区 }

5.3 flush刷新

5.4 复制

static void copy(string yuan,string md) { if (!File.Exists(yuan)) { throw new FileNotFoundException("文件不存在!"+yuan); } //1 创建流关联文件 StreamReader streamReader = new StreamReader(yuan); StreamWriter streamWriter = new StreamWriter(md); //2 选择读写方式:1 逐个字符读写 //while (true) { // int n=streamReader.Read(); // if (n == -1) { // Console.WriteLine("复制完毕!"); // break; // } // streamWriter.Write((char)n); // streamWriter.Flush(); //} //简化写法 //int n; //while ((n=streamReader.Read())!=-1) { // streamWriter.Write((char)n); // streamWriter.Flush(); //} //2 选择读写方式:2 逐行读写 //string line; //while ((line=streamReader.ReadLine())!=null) { // streamWriter.WriteLine(line); // streamWriter.Flush(); //} //3 选择读写方式:3 逐个字符数组读写 char[] arr = new char[1024];//定义一个字符数组 装每次读写的字符信息 int n;//定义变量记录每次读的有效字符数 while ((n=streamReader.ReadBlock(arr,0,arr.Length))!=0) { streamWriter.Write(arr, 0, n); streamWriter.Flush(); } //3 关闭流释放资源 streamWriter.Close(); streamReader.Close(); }

6 练习01

6.1 需求

练习1: 创建一个文件1.txt 写入10行 100以内加减乘除: 1+1 3*4 5/3 练习2: 对1.txt的算式进行运算 写到2.txt中 1+1=2 3*4=12 练习3: 把3.txt中的信息拆分成31.txt 32.txt.33.txt 31中放数字 32中放字母 33中放其他/汉字

6.2 代码

internal class Demo15_06练习 { static Random r = new Random(); static void Main(string[] args) { //v字仇杀队 // 练习1: // 创建一个文件1.txt 写入10行 100以内加减乘除: // 1 + 1 // 3 * 4 // 5 / 3 //练习2: // 对1.txt的算式进行运算 写到2.txt中 // 1 + 1 = 2 // 3 * 4 = 12 //练习3: 把3.txt中的信息拆分成31.txt 32.txt.33.txt // 31中放数字 // 32中放字母 // 33中放其他 / 汉字 // test01("C:\\Users\\miaot\\Desktop\\test"); test02("C:\\Users\\miaot\\Desktop\\test\\5ebdc45e6d_算术.txt"); test03("C:\\Users\\miaot\\Desktop\\test\\1.cs"); //创建一个文件 把学生进行存储: 12 韩梅梅 男 12.3 //对文件进行增删改查 } static void test03(string yuan) { StreamReader sr = new StreamReader(yuan); string name12= yuan.Insert(yuan.LastIndexOf("."), "数字"); string nameab= yuan.Insert(yuan.LastIndexOf("."), "字母"); string namehz= yuan.Insert(yuan.LastIndexOf("."), "汉字"); StreamWriter sw12 = new StreamWriter(name12); StreamWriter swab = new StreamWriter(nameab); StreamWriter swhz = new StreamWriter(namehz); string line; while ((line=sr.ReadLine())!=null) { //对读取的字符串进行判断 string sz = Regex.Replace(line, "\\D+", ""); string zm = Regex.Replace(line, "[^a-zA-Z]+", ""); string hz = Regex.Replace(line, "[^\\u4e00-\\u9fa5]+", ""); sw12.WriteLine(sz); sw12.Flush(); swab.WriteLine(zm); swab.Flush(); swhz.WriteLine(hz); swhz.Flush(); } sr.Close(); sw12.Close(); swab.Close(); swhz.Close(); } static void test02(string yuan) { //源文件的名字后面加答案 string md = yuan.Insert(yuan.LastIndexOf("."), "答案"); //创建流 StreamReader sr = new StreamReader(yuan); StreamWriter sw = new StreamWriter(md); string line = ""; while ((line=sr.ReadLine())!=null) { //对行数据进行处理 string lineNew=changeStr(line); sw.WriteLine(lineNew); sw.Flush(); } sw.Close(); sr.Close(); } //对行数据进行处理的方法 static string changeStr(string line) { if (line=="" || line.Trim().Length==0) { return line; } string lineNew = ""; //53-25 69-15 87-18 string[] strs = Regex.Split(line,"\\s+"); for (int i = 0; i < strs.Length; i++) { string ysf = strs[i].Contains("+") ? "+" : "-"; string num1Str = strs[i].Substring(0, strs[i].IndexOf(ysf)); string num2Str= strs[i].Substring(strs[i].IndexOf(ysf)+1); int num1=int.Parse(num1Str); int num2=int.Parse(num2Str); int result = ysf == "+" ?( num1 + num2 ): (num1 - num2); lineNew += num1 + ysf + num2 + "=" + result + "\t\t"; } return lineNew; } static void test01(string path) { //判断目录是否存在 if (!Directory.Exists(path)) { try { Directory.CreateDirectory(path); } catch (Exception e) { throw new Exception("出错了!::"+e); } } //生成一个文件名 string name = Guid.NewGuid().ToString().Replace("-", "").Substring(1, 10); name += "_算术.txt"; StreamWriter stream = new StreamWriter(path+"\\"+name); string line = ""; for (int i = 0; i < 60; i++) { string str = getStr(); line += str + (i%3==2?"":"\t\t"); if (i%3==2) { stream.WriteLine(line); stream.WriteLine(""); stream.Flush(); line = ""; } } stream.Close(); } //写一个方法 随机算式 static string getStr() { string ysf = r.NextDouble() > 0.5 ? "+" : "-"; while (true) { int n1 = r.Next(10, 90); int n2 = r.Next(10, 90); if (ysf=="-") { int max = n1 > n2 ? n1 : n2; return max + ysf + (n1 + n2 - max); } if (n1+n2<=100) { return n1 + ysf + n2; } } } }

7 练习02

7.1 需求

//创建一个文件 把学生进行存储: 12 韩梅梅 男 12.3 //对文件进行增删改查

7.2 代码

internal class Demo15_07练习 { //定义一个变量记录文件的位置 static string path = "C:\\Users\\miaot\\Desktop\\test\\student.txt"; static Random random = new Random(); static void Main(string[] args) { //List<Student15> list = getList(); //write(list); //List<Student15> list = read(); //foreach (Student15 s in list) { // Console.WriteLine(s); //} //添加 //addOne(new Student15(2001,"哈哈",100.0,'男')); //删除 //deleteOne(1001); //修改 //updateOne(new Student15(1002, "哈哈2", 20.0, '妖')); //查询一个 getOne(1001); getOne(1002); } //查询一个 static void getOne(int sid) { //先读取文件 List<Student15> list = read(); foreach (Student15 ss in list) { if (ss.sid==sid) { Console.WriteLine("查询结果是:"+ss); return; } } Console.WriteLine("sid=" + sid + "不存在!无法获取!"); } //添加 static void addOne(Student15 s) { //先读取文件 List<Student15> list = read(); bool b = false; foreach (Student15 ss in list) { if (ss.sid==s.sid) { b = true; break; } } if (b) { Console.WriteLine("sid=" + s.sid + "已存在!无法添加!"); return; } //把参数对象加到list list.Add(s); //再把list写到文件中 write(list); } //删除 static void deleteOne(int id) { //先读取文件 List<Student15> list = read(); bool b = true; //把lsit中和id相同的学生删除 for (int i = 0; i < list.Count; i++) { if (list[i].sid==id) { list.RemoveAt(i); b = false; break; } } if (b) { Console.WriteLine("sid="+id+"不存在!无法删除!"); return; } //再把list写到文件中 write(list); } //修改 static void updateOne(Student15 s) { //先读取文件 List<Student15> list = read(); bool b = true; //把lsit中和id相同的学生修改 for (int i = 0; i < list.Count; i++) { if (list[i].sid ==s.sid) { list[i] = s; b = false; break; } } if (b) { Console.WriteLine("sid=" + s.sid + "不存在!无法修改!"); return; } //再把list写到文件中 write(list); } //写一个方法 把文件中的xx读成list static List<Student15> read() { List<Student15> list=new List<Student15>(); StreamReader sr = new StreamReader(path); string line; while ((line = sr.ReadLine()) != null) { Student15 s=changeString2Student(line); list.Add(s); } sr.Close(); return list; } //写一个方法 把行信息 转换为stuent static Student15 changeString2Student(string line) { string[] strs=Regex.Split(line, "\\s+"); //sid+"\t"+sname+"\t"+sex+"\t"+score; Student15 student = new Student15(); student.sid=int.Parse(strs[0]); student.sname=strs[1]; student.sex = strs[2][0]; student.score = double.Parse(strs[3]); return student; } static List<Student15> getList() { List<Student15> list = new List<Student15>(); for (int i = 0; i < 10; i++) { list.Add(new Student15(1000+i, "韩梅梅"+i, random.Next(0,1000)/10.0, i%2==0?'男':'女')); } return list; } //写一个方法:把list写到path中 static void write(List<Student15> list) { StreamWriter sw = new StreamWriter(path); //一个学生对应一行 foreach (Student15 student in list) { sw.WriteLine(student); sw.Flush(); } sw.Close(); } } class Student15 { public int sid; public string sname; public double score; public char sex; public Student15() { } public Student15(int sid, string sname, double score, char sex) { this.sid = sid; this.sname = sname; this.score = score; this.sex = sex; } public override string ToString() { return sid+"\t"+sname+"\t"+sex+"\t"+score; } }

其他::

字符串和字节之间的转换

//字节数组和字符串之间的转换 //把字符串转化为字节数组 string str = "abc123苗天保"; byte[] arr1=UTF8Encoding.UTF8.GetBytes(str);//utf-8 byte[] arr2=Encoding.UTF8.GetBytes(str);//utf-8 byte[] arr3 = Encoding.ASCII.GetBytes(str);//ascii byte[] arr4=Encoding.GetEncoding(936).GetBytes(str);//gbk //把字节数组转化为字符串 str=UTF8Encoding.UTF8.GetString(arr1);//utf-8 Console.WriteLine(str); str =Encoding.UTF8.GetString(arr2);//utf-8 Console.WriteLine(str); str = Encoding.ASCII.GetString(arr3);//ascii 中文乱码 Console.WriteLine(str); str = Encoding.GetEncoding(936).GetString(arr4);//gbk Console.WriteLine(str);

快捷键

快捷键 功能 ctrl+k,c 注释选中行 ctrl+k,u 取消对选中行的注释 CTRL + SHIFT + B:生成解决方案 CTRL + F7 :生成编译 CTRL + O :打开文件 CTRL + SHIFT + O:打开项目 CTRL + SHIFT + C:显示类视图窗口 F4 :显示属性窗口 SHIFT + F4:显示项目属性窗口 CTRL + SHIFT + E:显示资源视图 F12 :转到定义 CTRL + F12:转到声明 CTRL + ALT + J:对象浏览 CTRL + ALT + F1:帮助目录 CTRL + F1 :动态帮助 F1 :帮助 SHIFT + F1:当前窗口帮助 CTRL + ALT + F3:帮助-搜索 SHIFT + ALT + ENTER:全屏显示 CTRL + -:向后定位 CTRL + SHIFT + -:向前定位 CTRL + F4:关闭文档窗口 CTRL + PAGE DOWN:光标定位到窗口上方 CTRL + PAGE UP:光标定位到窗口下方 CTRL + F6 : CTRL + TAB:下一个文档窗口 CTRL + SHIFT + F6 : CTRL + SHIFT + TAB:上一个文档窗口 ALT + F6:下一个面板窗口 CTRL + K, CTRL + L:取消remark CTRL + K, CTRL + C:注释选择的代码 CTRL + K, CTRL + U:取消对选择代码的注释 CTRL + M, CTRL + O:折叠代码定义 CTRL + M, CTRL + L:展开代码定义 CTRL + DELETE:删除至词尾 CTRL + BACKSPACE:删除至词头 SHIFT + TAB:取消制表符 CTRL + U:转小写 CTRL + SHIFT + U:转大写 CTRL + SHIFT + END:选择至文档末尾 CTRL + SHIFT + HOME:选择至文档末尾开始 SHIFT + END:选择至行尾 SHIFT + HOME:选择至行开始处 SHIFT + ALT + END:垂直选择到最后尾 SHIFT + ALT + HOME:垂直选择到最前面 CTRL + A:全选 CTRL + W:选择当前单词 CTRL + SHIFT + PAGE UP:选择至本页前面 CTRL + SHIFT + PAGE DOWN:选择至本页后面 CTRL + END:文档定位到最后 CTRL + HOME:文档定位到最前 CTRL + G:转到… CTRL + K, CTRL + P:上一个标签 CTRL + K, CTRL + N:下一个标签 ALT + F10:调试-ApplyCodeChanges CTRL + ALT+ Break:停止调试 CTRL + SHIFT + F9 :取消所有断点 CTRL + F9:允许中断 CTRL + SHIFT + F5:调试-重新开始 F5:运行调试 CTRL + F5:运行不调试 F10:跨过程序执行 F11:单步逐句执行 CTRL + J:列出成员 CTRL + PAGE DOWN:下一个视图 CTRL + B:格式-粗体 CTRL + SHIFT + T:格式-文字缩进 调试快捷键 F6: 生成解决方案 Ctrl+F6: 生成当前项目 F7: 查看代码 Shift+F7: 查看窗体设计器 F5: 启动调试 Ctrl+F5: 开始执行(不调试) Shift+F5: 停止调试 Ctrl+Shift+F5: 重启调试 F9: 切换断点 Ctrl+F9: 启用/停止断点 Ctrl+Shift+F9: 删除全部断点 F10: 逐过程 Ctrl+F10: 运行到光标处 F11: 逐语句 编辑快捷键 Shift+Alt+Enter: 切换全屏编辑 Ctrl+B,T / Ctrl+K,K: 切换书签开关 Ctrl+B,N / Ctrl+K,N: 移动到下一书签 Ctrl+B,P: 移动到上一书签 Ctrl+B,C: 清除全部标签 Ctrl+I: 渐进式搜索 Ctrl+Shift+I: 反向渐进式搜索 Ctrl+F: 查找 Ctrl+Shift+F: 在文件中查找 F3: 查找下一个 Shift+F3: 查找上一个 Ctrl+H: 替换 Ctrl+Shift+H: 在文件中替换 Alt+F12: 查找符号(列出所有查找结果) Ctrl+Shift+V: 剪贴板循环 Ctrl+左右箭头键: 一次可以移动一个单词 Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。 Ctrl+Shift+L: 删除当前行 Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态 Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态 Ctrl+M,P: 停止大纲显示 Ctrl+E,S: 查看空白 Ctrl+E,W: 自动换行 Ctrl+G: 转到指定行 Shift+Alt+箭头键: 选择矩形文本 Alt+鼠标左按钮: 选择矩形文本 Ctrl+Shift+U: 全部变为大写 Ctrl+U: 全部变为小写 代码快捷键 Ctrl+J / Ctrl+K,L: 列出成员 Ctrl+Shift+空格键 / Ctrl+K,P: 参数信息 Ctrl+K,I: 快速信息 Ctrl+E,C / Ctrl+K,C: 注释选定内容 Ctrl+E,U / Ctrl+K,U: 取消选定注释内容 Ctrl+K,M: 生成方法存根 Ctrl+K,X: 插入代码段 Ctrl+K,S: 插入外侧代码 F12: 转到所调用过程或变量的定义 窗口快捷键 Ctrl+W,W: 浏览器窗口 Ctrl+W,S: 解决方案管理器 Ctrl+W,C: 类视图 Ctrl+W,E: 错误列表 Ctrl+W,O: 输出视图 Ctrl+W,P: 属性窗口 Ctrl+W,T: 任务列表 Ctrl+W,X: 工具箱 Ctrl+W,B: 书签窗口 Ctrl+W,U: 文档大纲 Ctrl+D,B: 断点窗口 Ctrl+D,I: 即时窗口 Ctrl+Tab: 活动窗体切换 Ctrl+Shift+N: 新建项目 Ctrl+Shift+O: 打开项目 Ctrl+Shift+S: 全部保存 Shift+Alt+C: 新建类 Ctrl+Shift+A: 新建项 自动对齐/格式化 ctrl+a ctrl+k ctrl+f
http://www.jsqmd.com/news/676814/

相关文章:

  • Code2Prompt终极指南:三步将代码库转换为高质量AI提示的实战手册
  • 从LR(0)到LALR(1):一文理清编译原理中的LR分析族(以陈火旺课后题为例)
  • 中国出台药品说明书无障碍及适老化强制新政
  • Z-Image-Turbo-rinaiqiao-huiyewunv企业落地:中小动漫工作室IP角色快速可视化工具
  • 如何快速解决Windows热键冲突:Hotkey Detective终极指南
  • OpenFOAM v8波浪模拟:手把手教你配置waveAlpha和waveVelocity边界(附避坑指南)
  • 从手动复制到自动抓取:用res-downloader轻松获取全网视频资源
  • ExplorerPatcher:Windows系统界面深度定制框架的技术解析与应用实践
  • 2026年3月科研管理系统招标文件需求,科研管理系统/融合门户/一网通办平台,科研管理系统产品有哪些功能 - 品牌推荐师
  • 3分钟解锁B站缓存视频:m4s-converter智能转换方案全解析
  • 双架构方案:ESP32-audioI2S实现高性能音频流媒体播放的技术解析
  • B站字幕下载难题如何解决?3步掌握专业字幕提取技巧
  • 2026年全维度智能客服盘点,全企业适配高性价比售后有保障方案 - 品牌2026
  • 【美团-连锁餐饮品牌商 优惠券核销·对账清分结算系统流程图】
  • 避开Apriori算法的三个常见坑:用超市销售数据带你实战调参与结果解读
  • STM32串口通信完全无响应的系统化排查
  • Pi0 Robot Control Center环境配置:CUDA 12.x + PyTorch 2.3适配指南
  • 培洋机械:济南起重设备回收推荐哪些 - LYL仔仔
  • 向量检索不再需要放弃ORM?EF Core 10新扩展全链路落地,从NuGet安装到Cosmos DB混合向量查询,一文闭环
  • redis分布式锁
  • 告别安装报错!保姆级Quartus II 13.1 + ModelSim联调配置指南(附资源与避坑清单)
  • FanControl终极中文配置指南:5分钟实现专业级风扇控制
  • MATLAB+Yalmip+Gurobi一站式配置与实战验证指南
  • 湖北致信通建筑:宜昌专业的淤泥清理管道疏通 - LYL仔仔
  • 如何正确管理浮层提示(Tooltip)显示时的页面焦点顺序
  • 从标注到部署:手把手教你用Labelme标注数据并转COCO格式,喂给SOLOv2做实例分割
  • 【Excel提效 No.004】一句话搞定按条件拆分为多个独立Excel文件
  • FastLED终极指南:5分钟上手专业级Arduino LED动画库
  • 杭州银鑫物资回收:上城机电设备回收价格 - LYL仔仔
  • Thorium Reader终极指南:如何实现跨平台电子书的高效管理与沉浸式阅读