一、大文件读取方式
1.FileStream文件流(操作字节可以读取各种文件信息)
(1)FileStream文件流和File的区别
头文件的引入代码:
`using System.Text;
using System.IO;`
File在读取文件的时候是一次性读取所有的文件信息,而FileStream是以文件流的形式一点点去读取文件的信息
(2)使用FileStream读取文件
(3)使用FileStream写入文件信息
2.StreamReader和StreamWrite读写文本文件(读取字符信息)
1.StreamReader
2.StreamWriter
小练习:写一个程序逐行输入字符串,将每一行的内容写入到同个目录下的1.txt文件并换行,最后遇到q字符结束写入
(思考注意点:
如果这里文件不加后缀名.txt则会导致计算机将其识别为文件夹,且写入的方式是以覆盖的形式进行写入的,之前的数据会被覆盖掉)
注:
- 使用FileStream可以读取所有的文件,包括图片,音频等等,写法比较麻烦。
- 读取大文件的非图片或音频信息,我们就可以使用StreamReader,StreamWriter(读取到的是字符串)
扩展:
读取文件夹下的所有文件
二、字符串类String
1.关于字符串的几个方法
2.使用StringBuilder创建字符串
1.为什么要使用StringBuilder
如果我们频繁去删除和添加字符串中的内容,使用string生成的字符串我们知道每次更改会重新指向堆中新的数据,这样会重复删除新建数据非常耗性能,
思考:StringBuilder不会频繁申请内存空间,可以自动向后扩展,说白了就是一种创建字符串的高性能手段。
2.StringBuilder创建字符串的方式
Console.WriteLine(str1.Length) //获取字符串的长度并打印
Console.WriteLine(str2.Capacity)//获取字符串的容量并打印
补充: 当小于16的时候基本容量是16,如果大于16那就扩展和字符串的长度一致。 这里的Append追加指的是在字符串的末尾添加追加的内容。
三、正则表达式
1.正则表达式有什么用?
1.1、标准解释:
1.2、课堂理解:
1、 识别字符串是否满足对应的表达式。(判定)
2、 识别出指定的字符串,然后进行替换。(替换)
1.3、难点:
如何书写正则表达式 正则表达式由很多元字符组成,实际上还是一个字符串。
注: [a-z]代表的是a-z的任意一个字符,
2.正则表达式是什么?
正则表达式其实就是由普通字符以及特殊字符(元字符)组成的文字模式,该模式描述在查找文字主体时待匹配的一个或多个字符串。
3.各种元字符(重难点)
(1)字符类
[ char_group]:匹配**字符组中**的任意一个字符
[^char_group]:匹配**除字符组之外**的任意一个字符
[first-last]:匹配从first到last的字符范围中的任意一个字符,字符范围包括first和last。
.一个点:通配符,匹配除\n之外的任意一个字符
\w:匹配任意一个单词(word)字符,单词字符通常是指A-Z、a-z和0-9
\W:匹配任意一个非单词字符,是指除A-Z、a-z和0-9之外的字符 注意:如果再加一个/,取消原字符的作用。
\s:匹配任意一个空白字符
\S:匹配任意一个非空白字符
\d:匹配任意一个数字字符
\D:匹配任意一个非数字字符
复制代码
(2)定位类
^:默认情况下,匹配字符串的开始位置;在多行模式下,匹配每行的开始位置;
**举例1:** @"^1$"表示1开头,1结尾,符合条件输出:true 反之 false
**举例2:** @"^1{3,5}$ 输入:sjadsadhsad111afsaffs 结果:true
$:默认情况下,匹配字符串的结束位置,或 字符串结尾的\n之前的位置;在多行模式下,匹配每行结束之前的位置,或者每行结尾的\n之前的位置。
\A:匹配字符串的开始位置;
\Z:匹配字符串的结束位置,或 字符串结尾的\n之前的位置;
\z:匹配字符串的结束位置;
\G:匹配上一个匹配结束的位置;
\b:匹配一个单词的开始或结束的位置;
\B:匹配一个单词的中间位置;
复制代码
(3)量词、贪婪和懒惰
*:规定前面字符出现0次或多次
+:出现1次或多次
?:出现0次或1次
{n}:出现n次
举例:@"(真好){3}" 真好倘若出现>=3次 输出true 反之false
{n,}:出现至少n次
{n,m}:出现n到m次
x|y x或者y中的一个字符
3.Regex.Replace()方法替换匹配出来的字符串
4.Regex.IsMatch(字符串,正则表达式)判断字符串是否符合正则表达式
5.匹配是否是正确的邮箱
课堂练习:
例:识别qq邮箱 4到11位的数字 开头不能是0 结尾为@qq.com
string qqmail = @"^[1-9]\d{3,10}(@qq.com)$";
string str = Convert.ToString(Console.ReadLine());
Console.WriteLine(Regex.IsMatch(str, qqmail));
邮箱的格式是qq号(5~12位数字)+@qq.com
6.Regex.Match(s,pattern)匹配第一个满足的字符串
7.Regex.Matches(s,pattern)匹配所有满足的字符串并返回出来
8.常见的几个正则表达式
9 例题1.常见的几个正则表达式日期格式的匹配正则表达式问题:年份:0000到2999 月份1到12 日期1到31
string date =@"(^[0-2]|[0-9]{3})-([0][1-9]|[1][0-2])-([0][1,9]|[1-2][0-9]|[3][01])$" ;
while (true)
{
//返回所有的子串 Matches
string str = Console.ReadLine();
Console.WriteLine(Regex.IsMatch(str, date));
}
10 例题2
使用学到的文件操作,创建三个文件文件名分别是数学.txt,语文.txt,英语.txt,里面分别存放着50个学生的数学,语文,英语成绩,每一行放着名字和对应的分数,名字是小明1,小明2这样的规律显示,分数随机,每一行显示的完整内容是 科目+名字+分数,接下来用我们前面讲到的正则表达式,找出所有txt文件中的小明1的成绩逐行显示到1.txt文件中
代码总体逻辑的梳理: 代码总体思路:流写入(for循环遍历、随机数的生成)、关闭文件→文件内容读取(正则表达式定义和判定)→文件的再次写入
//找出三个文档中的小明1成绩,并将其进行拼接到新的文件当中。
StreamWriter math = new StreamWriter("./数学.txt");
StreamWriter language = new StreamWriter("./语文.txt");
StreamWriter english = new StreamWriter("./英语.txt");
Random score = new Random();
for (int i = 1;i <= 50;i++) {
string nscore = score.Next(0, 101).ToString();
math.WriteLine("数学成绩:" + "小明" + i + " "+ nscore);
language.WriteLine("语文成绩:" + "小明" + i + " " + nscore);
english.WriteLine("英语成绩:" + "小明" + i + " " + nscore);
}
math.Close();//一定要有此选项,否则会导致写入失败,但是代码程序不会报错;
language.Close();
english.Close();
//找出三个文档中的小明1成绩,并将其进行拼接到新的文件当中。
StreamReader Rmath = new StreamReader("./数学.txt");
StreamReader Rlanguage = new StreamReader("./语文.txt");
StreamReader Renglish = new StreamReader("./英语.txt");
string math1 = Rmath.ReadLine();
string language1 = Rlanguage.ReadLine();
string english1 = Renglish.ReadLine();
string pattern = @"小明1";
StreamWriter grade = new StreamWriter("./1.txt");
if (Regex.IsMatch(math1,pattern) ) {
grade.WriteLine(math1);
}
if (Regex.IsMatch(language1, pattern))
{
grade.WriteLine(language1);
}
if (Regex.IsMatch(english1, pattern))
{
grade.WriteLine(english1);
}
grade.Close();
代码总体思路:流写入(for循环遍历、随机数的生成)、关闭文件→文件内容读取(正则表达式定义和判定)→文件的再次写入
StreamReader Rmath = new StreamReader("./数学.txt");
StreamReader Rlanguage = new StreamReader("./语文.txt");
StreamReader Renglish = new StreamReader("./英语.txt");
string math1 = Rmath.ReadLine();
string language1 = Rlanguage.ReadLine();
string english1 = Renglish.ReadLine();
string pattern = @"小明1";
StreamWriter grade = new StreamWriter("./1.txt");
if (Regex.IsMatch(math1,pattern) ) {
grade.WriteLine(math1);
}
if (Regex.IsMatch(language1, pattern))
{
grade.WriteLine(language1);
}
if (Regex.IsMatch(english1, pattern))
{
grade.WriteLine(english1);
}
grade.Close();
10 例题3
请利用面向对象分析实现图书管理系统,具有录入,查询 ,删除,显示所有图书信息功能。借助文件操作的方式存储数据,将书籍存放到图书文件夹下,每本书都是一个txt文件,文件名为该书的名字,书中的初始内容为书名,图书的数据有书名,作者,价格,删除的时候要输入书的名字来进行删除。
该项目的一个思考
- 信息存在的话不要添加需要使用if语句实现一个过滤操作
- 查询、增加、删该都要注意使用if语句的判断,使系统逻辑设计的更加严谨
- 方法函数用类进行封装
- 交互的东西不要写在函数里面
- $用于字符串的拼接代替传统的➕实现拼接