C#入门篇章— IO操作
C# IO操作
一、String常用API
string 关键字是 System.String 类的别名。
1. 创建 String 对象
创建String对象的方法:
- 通过给 String 变量指定一个字符串
 - 通过使用 String 类构造函数
 - 通过使用字符串串联运算符( + )
 - 通过检索属性或调用一个返回字符串的方法
 - 通过格式化方法来转换一个值或对象为它的字符串表示形式
 
// 示例
using System;
namespace StringApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            //通过使用 string 构造函数
            char[] letters = { 'H', 'e', 'l', 'l','o' };
            string greetings = new string(letters);
            Console.WriteLine("Greetings: {0}", greetings);
            //方法返回字符串
            string[] sarray = { "Hello", "From", "Tutorials", "Point" };
            string message = String.Join(" ", sarray);
            Console.WriteLine("Message: {0}", message);
            //用于转化值的格式化方法
            DateTime waiting = new DateTime(2012, 10, 10, 17, 58, 1);
            string chat = String.Format("Message sent at {0:t} on {0:D}",
            waiting);
            Console.WriteLine("Message: {0}", chat);
            Console.ReadKey() ;
        }
    }
}
// 输出结果
Greetings: Hello
Message: Hello From Tutorials Point
Message: Message sent at 17:58 on Wednesday, 10 October 2012Substring方法
Substring(索引, 个数);
// 例:
string s = "abcde";
s.Substring(0, 3); // abc
s.Substring(3); // de2. String 类的属性
String类具有以下两个属性:
序号  | 属性名称 & 描述  | 
1  | Chars:在当前 String 对象中获取 Char 对象的指定位置。  | 
2  | Length:在当前的 String 对象中获取字符数。  | 
3. String 类的方法
序号  | 方法名称 & 描述  | 
1  | public static int Compare( string strA, string strB )比较两个指定的 string 对象,并返回一个表示它们在排列顺序中相对位置的整数。该方法区分大小写。  | 
2  | public static int Compare( string strA, string strB, bool ignoreCase )比较两个指定的 string 对象,并返回一个表示它们在排列顺序中相对位置的整数。但是,如果布尔参数为真时,该方法不区分大小写。  | 
3  | public static string Concat( string str0, string str1 )连接两个 string 对象。  | 
4  | public static string Concat( string str0, string str1, string str2 )连接三个 string 对象。  | 
5  | public bool Contains( string value )返回一个表示指定 string 对象是否出现在字符串中的值。  | 
6  | public static string Copy( string str )创建一个与指定字符串具有相同值的新的 String 对象。  | 
7  | public void CopyTo( int sourceIndex, char[] destination, int destinationIndex, int count )从 string 对象的指定位置开始复制指定数量的字符到 Unicode 字符数组中的指定位置。  | 
8  | public bool EndsWith( string value )判断 string 对象的结尾是否匹配指定的字符串。  | 
9  | public bool Equals( string value )判断当前的 string 对象是否与指定的 string 对象具有相同的值。  | 
10  | public static bool Equals( string a, string b )判断两个指定的 string 对象是否具有相同的值。  | 
11  | public static string Format( string format, Object arg0 )把指定字符串中一个或多个格式项替换为指定对象的字符串表示形式。  | 
12  | public int IndexOf( char value )返回指定 Unicode 字符在当前字符串中第一次出现的索引,索引从 0 开始。  | 
13  | public int IndexOf( string value )返回指定字符串在该实例中第一次出现的索引,索引从 0 开始。  | 
14  | public int IndexOf( char value, int startIndex )返回指定 Unicode 字符从该字符串中指定字符位置开始搜索第一次出现的索引,索引从 0 开始  | 
15  | public int IndexOf( string value, int startIndex )返回指定字符串从该实例中指定字符位置开始搜索第一次出现的索引,索引从 0 开始  | 
16  | public int IndexOfAny( char[] anyOf )返回某一个指定的 Unicode 字符数组中任意字符在该实例中第一次出现的索引,索引从 0 开始。  | 
17  | public int IndexOfAny( char[] anyOf, int startIndex )返回某一个指定的 Unicode 字符数组中任意字符从该实例中指定字符位置开始搜索第一次出现的索引,索引从 0 开始。  | 
18  | public string Insert( int startIndex, string value )返回一个新的字符串,其中,指定的字符串被插入在当前 string 对象的指定索引位置。  | 
19  | public static bool IsNullOrEmpty( string value )指示指定的字符串是否为 null 或者是否为一个空的字符串。  | 
20  | public static string Join( string separator, string[] value )连接一个字符串数组中的所有元素,使用指定的分隔符分隔每个元素。  | 
21  | public static string Join( string separator, string[] value, int startIndex, int count )连接一个字符串数组中的指定位置开始的指定元素,使用指定的分隔符分隔每个元素。  | 
22  | public int LastIndexOf( char value )返回指定 Unicode 字符在当前 string 对象中最后一次出现的索引位置,索引从 0 开始。  | 
23  | public int LastIndexOf( string value )返回指定字符串在当前 string 对象中最后一次出现的索引位置,索引从 0 开始  | 
24  | public string Remove( int startIndex )移除当前实例中的所有字符,从指定位置开始,一直到最后一个位置为止,并返回字符串。  | 
25  | public string Remove( int startIndex, int count )从当前字符串的指定位置开始移除指定数量的字符,并返回字符串。  | 
26  | public string Replace( char oldChar, char newChar )把当前 string 对象中,所有指定的 Unicode 字符替换为另一个指定的 Unicode 字符,并返回新的字符串。  | 
27  | public string Replace( string oldValue, string newValue )把当前 string 对象中,所有指定的字符串替换为另一个指定的字符串,并返回新的字符串。  | 
28  | public string[] Split( params char[] separator )返回一个字符串数组,包含当前的 string 对象中的子字符串,子字符串是使用指定的 Unicode 字符数组中的元素进行分隔的。  | 
29  | public string[] Split( char[] separator, int count )返回一个字符串数组,包含当前的 string 对象中的子字符串,子字符串是使用指定的 Unicode 字符数组中的元素进行分隔的。int 参数指定要返回的子字符串的最大数目。  | 
30  | public bool StartsWith( string value )判断字符串实例的开头是否匹配指定的字符串。  | 
31  | public char[] ToCharArray()返回一个带有当前 string 对象中所有字符的 Unicode 字符数组。  | 
32  | public char[] ToCharArray( int startIndex, int length )返回一个带有当前 string 对象中所有字符的 Unicode 字符数组,从指定的索引开始,直到指定的长度为止。  | 
33  | public string ToLower()把字符串转换为小写并返回。  | 
34  | public string ToUpper()把字符串转换为大写并返回。  | 
35  | public string Trim()移除当前 String 对象中的所有前导空白字符和后置空白字符。  | 
void Test1()
{
    string str1 = "BAD";
    // 1.Length
    Debug.Log("str1.Length: " + str1.Length);
    string str2 = "bad";
    // 2.Compare
    // Compare 返回值  =0,代表两个字符串相等;非0,表示不相等
    // 注意:在C#中,字符串是对大小写敏感的
    Debug.Log("str1 & str2 Compare: " + string.Compare(str1, str2));
    Debug.Log("str1 & str2 Compare(忽略大小写): " + string.Compare(str1, str2, true));
    // 3.Equals
    Debug.Log(string.Equals(str1, str2));
    Debug.Log(str1.Equals(str2));
    // 4.Concat 连接string对象
    Debug.Log(string.Concat(str1, str2));
    // 5.Format 格式化输出
    Debug.Log(string.Format("name:{0} age:{1}", "张三", 14));
    // 6.Contains 判断字符串中是否包含目标字符串(只能判断字符串)
    Debug.Log(str1.Contains("A"));
    Debug.Log(str1.Contains("d"));
    // 7.IndexOf 返回指定字符/字符串的索引
    Debug.Log(str1.IndexOf("D"));
    // 8.LastIndexOf 返回指定字符/字符串最后出现位置的索引
    string str3 = "INTERESTING";
    Debug.Log(str3.LastIndexOf("I"));
    // 9.StartWith/EndWith 判断开头/结尾是否是某个字母
    Debug.Log(str1.StartsWith("B"));
    Debug.Log(str1.EndsWith("B"));
    // 10.Insert 返回插入后的字符串
    Debug.Log(str1.Insert(0, "NOT"));
    // 11.IsNullOrEmpty 判断字符串是否为空
    Debug.Log(string.IsNullOrEmpty(str1));
    // 12.Remove 移除 开始位置 + 结束位置
    Debug.Log(str2.Remove(0, 2) + str2);
    // 13.Replace 替换 被替换字符 + 替换字符
    Debug.Log(str1.Replace("B", "b"));
    // 14.Split 分割字符串
    string[] arr = str3.Split(new char[] { 'R' });
    for (int i = 0; i < arr.Length; i++)
    {
        Debug.Log(arr[i]);
    }
    // 15.ToUpper/ToLower 转为大/小写
    Debug.Log(str2.ToUpper());
    Debug.Log(str3.ToLower());
    // 16.Trim 去掉空格
    string str4 = " Job";
    Debug.Log("str4:" + str4.Trim());
}二、StringBuilder常用API
1. StringBuilder 类的作用:
string对象是不可变的,每次修改都会创建一个新的对象,StringBuilder可以保证修改字符串而不创建新的对象。
2. StringBuilder 类的使用
通过一个重载的构造函数方法初始化变量,就可以创建 StringBuilder 类的新实例。
StringBuilder MyStringBuilder = new StringBuilder("Hello World");3. 设置容量和长度
StringBuilder对象是动态对象,允许扩充它所封装的字符串中字符的数量。
对象的容量:StringBuilder对象可容纳的最大字符数。
长度:StringBuilder对象容纳的字符串长度。
两者不能混为一谈,StringBuilder对象在达到容量之前,不会为其自己重新分配空间。当达到容量时,将自动分配新的空间,且容量翻倍。
4. StringBuilder 常用方法
(1)Append("string")方法:
该方法用来将文本或对象的字符串表示形式添加到当前StringBuilder对象表示的字符串结尾处。
(2)AppendFormat("{0:C}", MyInt)方法:
AppendFormat方法可自定义变量的格式,并将这些值追加到StringBuilder后面。
(3)Insert(index, "string")方法
该方法会将字符串或对象添加到当前 StringBuilder中的指定位置。
(4)Remove(index, num)方法
可使用Remove方法从当前StringBuilder中移除指定数量的字符,移除过程从指定的从零开始的索引处开始。
(5)Replace('a', 'z')方法
Replace方法可将另一个指定的字符来替换StringBuilder对象内的字符。
5. StringBuilder 示例
void Test1()
{
    StringBuilder strB = new StringBuilder("Hello World !");
    strB.Capacity = 25;
    // 1.打印strB的长度和容量
    Debug.Log("strB.Length: " + strB.Length
              + " strB.Capacit: " + strB.Capacity);
    // 2.常用API
    // 2.1 Append 末尾追加
    strB = strB.Append(" What a Beautiful Day.");
    Debug.Log("strB.Append: " + strB.ToString());
    // 2.2 AppendFormat 格式化追加
    strB = strB.AppendFormat("{0}", 9888);
    Debug.Log("strB.AppendFormat: " + strB.ToString());
    // 2.3 Insert 插入
    strB = strB.Insert(6, "Beautiful");
    Debug.Log("strB.Insert: " + strB.ToString());
    // 2.4 Remove 移除
    strB = strB.Remove(6, 9);
    Debug.Log("strB.Remove: " + strB.ToString());
    // 2.5 Replace 替换
    strB = strB.Replace('H', 'h');
    Debug.Log("strB.Replace: " + strB.ToString());
    // 链式表达的概念
    StringBuilder strB2 = new StringBuilder("Hello");
    strB2 = strB2.Append("+").Append("-").Append("*");
    Debug.Log("链式表达的写法:" + strB2.ToString());
}三、String和StringBuilder的区别
string本身是不可改变的,它只能赋值一次,每一次内容发生改变,都会生成一个新的对象,然后原有的对象引用新的对象,而每一次生成新对象都会对系统性能产生影响,这会降低 .NET 编译器的工作效率。
而StringBuilder类则不同,每次操作都是对自身对象进行操作,而不是生产新的对象,其所占空间会随着内容的增加而扩充。这样,在做大量的修改操作时,不会因生成大量匿名对象而影响系统性能。
四、FileStream文件读写
在 C# 语言中文件读写流使用 FileStream 类主要用于文件的读写,不仅能读写普通的文本文件,还可以读取图像文件,声音文件等不同格式的文件。
1. 各枚举类型的值
在创建 FileStream 类的实例时还会涉及多个枚举类型的值,包括 FileAccess、FileMode、FileShare、FileOption等。
- FileAccess
 - 枚举类型主要用于设置文件的访问方式,具体枚举值如下:
 - Read
 - :以只读方式打开文件;
 - Write
 - :以写方式打开文件;
 - ReadWrite
 - :以读写方式打开文件。
 
- FileMode
 - 枚举类型主要用于设置文件打开或创建的方式,具体枚举类型如下:
 - CreateNew
 - :创建新文件,如果文件已经存在,则会抛出异常;
 - Create
 - :创建文件,如果文件已经存在,则会输出异常;
 - Open
 - :打开已经存在的文件,如果文件不存在,则会抛出异常;
 - OpenOrCreate
 - :打开已经存在的文件,如果文件不存在则创建文件;
 - Truncate
 - :打开已经存在的文件,并清除文件中的内容,保留文件的创建日期,如果文件不存在,则会抛出异常;
 - Append
 - :打开文件,用于向文件中追加内容,如果文件不存在,则创建一个新文件。
 
- FileShare
 - 枚举类型主要用于设置多个对象同时访问同一个文件时的访问控制,具体枚举值如下:
 - None
 - :谢绝共享当前文件;
 - Read
 - :允许随后打开文件读取信息;
 - ReadWrite
 - :允许随后打开文件读写信息;
 - Write
 - :允许随后打开文件写入信息;
 - Delete
 - :允许随后删除文件;
 - Inheritable
 - :使文件句柄可由子进程继承。
 
- FileOptions
 - 枚举类型用于设置文件的高级选项,包括文件是否加密,访问后是否删除等,具体枚举值如下:
 - WriteThrough
 - :指示系统应通过任何中间缓存、直接写入磁盘;
 - None
 - :指示在生成 System.IO.FileStream 对象时不应使用其他选项;
 - Encrypted
 - :指示文件是加密的,只能通过用于加密的同一用户账户来解密;
 - DeleteOnClose
 - :指示当不再使用某个文件时自动删除该文件;
 - SequentialScan
 - :指示按从头到尾的顺序访问文件;
 - RandomAccess
 - :指示随机访问文件;
 - Asynchronous
 - :指示文件可用于异步读取和写入。
 
2. 常用 FileStream 类的构造方法
构造方法  | 说明  | 
FileStream(string path, FileMode mode)  | 使用指定路径的文件、文件模式创建 FileStream 类的实例  | 
FileStream(string path, FileMode mode, FileAccess access)  | 使用指定路径的文件、文件打开模式、文件访问模式创建 FileStream类的实例  | 
FileStream(string path, FileMode mode, FileAccess access, FileShare share)  | 使用指定的路径、创建模式、读写权限和共享权限创建 FileStream类的一个新实例  | 
FileStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions)  | 使用指定的路径、创建模式、读写权限和共享权限、其他文件选项创建 FileStream类的实例  | 
通过实例来演示 FileStream类的应用:
using System.IO;
using System.Text;
public class filestream : MonoBehaviour
{
    void Start()
    {
        CreateFile();
        ReadFile();
    }
    void CreateFile()
    {
        // 定义文件路径
        string path = @"C:\Users\Dukenone\test01\Assets\Resources\student.txt";
        // 创建 FileStream 类的实例
        FileStream fileStream = new FileStream(path,
            FileMode.OpenOrCreate, FileAccess.ReadWrite, 
            FileShare.ReadWrite);
        // 定义学号
        string msg = "1910300421";
        // 将字符串转换为字节数组
        byte[] bytes = Encoding.UTF8.GetBytes(msg);
        // 向文件中写入字节数组
        fileStream.Write(bytes, 0, bytes.Length);
        // 刷新缓冲区
        fileStream.Flush();
        // 关闭流
        fileStream.Close();
    }
    void ReadFile()
    {
        // 定义文件路径
        string path = @"C:\Users\Dukenone\test01\Assets\Resources\student.txt";
        // 判断是否含有指定文件
        if(File.Exists(path))
        {
            FileStream fileStream = new FileStream(path,
                FileMode.Open, FileAccess.Read);
            // 定义存放文件信息的字节数组
            byte[] bytes = new byte[fileStream.Length];
            // 读取文件信息
            fileStream.Read(bytes, 0, bytes.Length);
            // 将得到的字节型数组重写编码为字符型数组
            string c = Encoding.UTF8.GetString(bytes);
            // 输出学生学号
            Debug.Log("学生学号为: " + c);
            // 关闭流
            fileStream.Close();
        }
        else
        {
            Debug.LogError("您查看的文件不存在");
        }
    }
}五、StreamReader/StreamWriter读写文件
http://System.IO 命名空间下的 StreamReader 和 StreamWriter 类可以用于文本文件的数据读写。这些类继承自抽象基类 Stream,Stream 类提供了对文件流读写的功能。
1. StreamReader
StreamReader 类继承自抽象基类TextReader,用来从文件中读取一系列字符,下面是StreamReader类中一些常用的方法:
方法  | 描述  | 
public override void Close()  | 关闭StreamReader对象和基础流,并释放任何与之相关的系统资源  | 
public override int Peek()  | 返回下一个可用的字符,但不使用它  | 
public override int Read()  | 从输入流中读取下一个字符,并把字符位置往前移一个字符  | 
2. StreamWriter
StreamWriter 类同样继承自抽象类 TextWriter,用来向文件中写入一系列字符,下面是 StreamWriter 类中一些常用的方法:
方法  | 描述  | 
public override void Close()  | 关闭当前的 StreamWriter 对象和基础流  | 
public override void Flush()  | 清理当前所有的缓冲区,使所有缓冲数据写入基础流  | 
public virtual void Write(bool value)  | 将布尔值的文本表示形式写入文本流  | 
public override void Write(char value)  | 将一个字符写入流  | 
public virtual void Wrtie(decimal value)  | 将一个小数值的文本表示形式写入文本流  | 
public virtual void Write(double value)  | 将一个8字节浮点值的文本表示形式写入文本流  | 
public virtual void Write(int value)  | 将一个4字节浮点值的文本表示形式写入文本流  | 
public override void Write(string value)  | 将一个字符串写入文本流  | 
public virtual void WriteLine()  | 将行结束符写入文本流  | 
利用 StreamWriter 和 StreamReader 读写文件的实例:
void CreateFile()
{
    // 定义文件路径
    string path = @"C:\Users\Dukenone\test01\Assets\Resources\student2.txt";
    // 创建 StreamWriter 类的实例
    StreamWriter streamWriter = new StreamWriter(path);
    // 向文件中写入姓名
    streamWriter.WriteLine("李四");
    // 向文件中写入手机号
    streamWriter.WriteLine("13697265266");
    // 刷新缓存
    streamWriter.Flush();
    // 关闭流
    streamWriter.Close();
}
void ReadFile()
{
    // 定义文件路径
    string path = @"C:\Users\Dukenone\test01\Assets\Resources\student2.txt";
    // 创建 StreamReader 类的实例
    StreamReader streamReader = new StreamReader(path);
    // 判断文件中是否有字符
    while(streamReader.Peek() != -1)
    {
        // 读取文件中的一行字符
        string str = streamReader.ReadLine();
        Debug.Log(str);
    }
    // 关闭流
    streamReader.Close();
}六、Directory/DirectoryInfo操作文件夹
1. Directory类:文件夹操作
Directory 类是一个静态类,不能创建该类的实例,而是直接通过 “类名, 类成员” 的形式调用其属性和方法。
Directory 类调用实例:
void TestDirectory()
{
    string strDir = @"C:\Users\Dukenone\test01\Assets\Resources\DirTest";
    // 创建文件夹
    Directory.CreateDirectory(strDir);
    // 判断某路径的文件夹是否存在
    Directory.Exists(strDir);
    // 删除指定的文件夹
    Directory.Delete(strDir);
    // 如果该路径存在此文件夹就删除它,不存在就创建
    if(Directory.Exists(strDir))
    {
        Directory.Delete(strDir);
    }
    else
    {
        Directory.CreateDirectory(strDir);
    }
    // 将指定文件夹移动到指定位置
    Directory.Move(strDir, @"C:\Users\Dukenone\test01\Assets\DirTest");
    // 若待删除的文件夹下存在子文件夹,则需要传递 true
    // 这样将递归删除该文件夹下的子文件夹,同时删除自己
    Directory.Delete(@"C:\Users\Dukenone\test01\Assets\DirTest", true);
}2. DirectoryInfo类:文件夹操作
DirectoryInfo类能创建该类的实例,通过类的实例访问类成员。
DirectoryInfo类提供了一个构造方法,语法如下:
DirectoryInfo(string path)DirectoryInfo 调用实例:
void TestDirectoryInfo()
{
    string strDir = @"C:\Users\Dukenone\test01\Assets\Resources\DirTest";
    // 创建文件夹
    DirectoryInfo directoryInfo = new DirectoryInfo(strDir);
    directoryInfo.Create();
    // 创建子文件夹
    directoryInfo.CreateSubdirectory("code_1");
    directoryInfo.CreateSubdirectory("code_2");
    // 删除文件夹 true 同时递归删除下面的子文件夹
    //directoryInfo.Delete(true);
    // 返回当前目录的子目录
    IEnumerable<DirectoryInfo> dir = directoryInfo.EnumerateDirectories();
    foreach(var v in dir)
    {
        Debug.Log(v.Name);
    }
    // 移动文件夹
    directoryInfo.MoveTo(@"C:\Users\Dukenone\test01\Assets\DirTest");
}相关文章
- Spring Boot中对接Twilio以实现发送验证码和验证短信码
 - Spring Boot 3.5:这次更新让你连配置都不用写了,惊不惊喜?
 - Spring Boot+Pinot实战:毫秒级实时竞价系统构建
 - SpringBoot敏感配置项加密与解密实战
 - SpringBoot 注解最全详解,建议收藏!
 - Spring Boot 常用注解大全:从入门到进阶
 - SpringBoot启动之谜:@SpringBootApplication如何让配置化繁为简
 - Springboot集成Kafka原理_spring集成kafka的原理
 - Spring Boot中@Data注解的深度解析与实战应用
 - 大佬用1000字就把SpringBoot的配置文件讲的明明白白!
 
