C#基础知识及题目练习 Day8 文件操作 FileStream StreamWriter 序列化和反序列化

一、Path

1、GetFileName();   //获取文件名

2、GetFileNameWithoutExtention();   //获取不带扩展名的文件名称

3、GetExtension(); //获取扩展名

4、GetDirectionName();  获得文件所在的文件夹的路径

5、GetFullPath(); 获得文件的完整路径

6、Path.Combine(); 将两个路径合并成一个路径

C#基础知识及题目练习 Day8 文件操作 FileStream StreamWriter 序列化和反序列化_第1张图片

二、File

1、Create():创建文件

2、Delete():删除文件

3、Copy():复制文件

C#基础知识及题目练习 Day8 文件操作 FileStream StreamWriter 序列化和反序列化_第2张图片

4、

1)读取文件(字节数组—》字符串)

ReadAllBytes():从文件中读取字节数组

 Encoding.Default.GetString():将读取的字节数组转换为字符串

 

2)写入文件(字符串-》字节数组)

将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的资源

WriteAllBytes():创建一个新文件,将字节数组写入其中,关闭文件。

Encoding.Default.GetBytes():将字符串转换成字节数组

            #region 写入文件(字符串-》字节数组)
            string inputFile = "今天天气好晴朗,处处好风光。";
            //将字符串转换成字节数组
            byte[] byteInput = Encoding.Default.GetBytes(inputFile);
            //File.WriteAllBytes():创建一个新文件,将字节数组写入其中,关闭文件。
            File.WriteAllBytes(@"E:\1.txt", byteInput);
            Console.WriteLine("写入成功");
            Console.ReadKey();
            #endregion

5、ReadAllLines():使用指定的编码读取所有行,然后关闭文件

ReadAllText():打开文件,使用指定的编码读取所有行,然后关闭文件

WriteAllLines():使用指定的编码创建一个新文件,然后写入文件

WriteAllText():使用指定的编码创建一个新文件,然后写入文件

AppendAllText():向现有文件中追加文本

C#基础知识及题目练习 Day8 文件操作 FileStream StreamWriter 序列化和反序列化_第3张图片

6、绝对路径和相对路径

1)绝对路径:通过给定的这个路径直接能在我的电脑中找到这个文件

2)相对路径:文件相对于应用程序的路径

在开发中应尽量使用相对路径

三、编码格式

什么叫做编码:将字符串以什么样的形式保存为二进制

C#基础知识及题目练习 Day8 文件操作 FileStream StreamWriter 序列化和反序列化_第4张图片

 

四、FileStream:操作字节

1、与File区别

File:一次性将文件全部读出,对内存造成的压力比较大,适合小文件操作,

FileStream: 一点点把文件读出,对内存造成的压力比较小,适合操作大文件。

2、FileStream fsRead=new FileStream(“路径”,“FileMode.OpenOrCreate”,”FIleAccess.Read”)

            #region FileStream:操作字节
            // FileStream: 一点点把文件读出,对内存造成的压力比较小,适合操作大文件。
            FileStream fileRead = new FileStream(@"E:\1.txt", FileMode.OpenOrCreate, FileAccess.Read);
            //FileMode.OpenOrCreate 如果文件存在,则打开文件,把指针指到文件的开始;如果文件不存在,则新建文件
            //FileAccess.Read 读取文件
            byte[] buffer = new byte[1024 * 1024 * 5];
            //声明了一个字节数组,大小为5M。
            int rCount = fileRead.Read(buffer, 0, buffer.Length);
            // 0表示从那个字节读取数据 读取长度为buffer.Length 存放在buffer中
            //返回本次实际读到的有效字节数。
            Console.WriteLine(rCount);// 28? 25+3?
            string sFile = Encoding.Default.GetString(buffer, 0, rCount);
            //将字节数组buffer中的每一个元素(从0到r)按照默认的编码格式解码成字符串
            fileRead.Close();
            fileRead.Dispose();
            Console.WriteLine(sFile);//jttqhql,cchfg 13
            #endregion

r:实际读取到的有效字节。在解码的时候,只解码有效字节,剩余无效字节不再解码

3、将创建文件流对象的过程写在using当中,会自动帮我们释放流所占用的资源。

如果出现乱码问题,统一格式,如都改成utf-8

C#基础知识及题目练习 Day8 文件操作 FileStream StreamWriter 序列化和反序列化_第5张图片

4、例:用FileStream完成多媒体文件的复制

思路:先将多媒体文件读取出来,然后写入到指定的位置

C#基础知识及题目练习 Day8 文件操作 FileStream StreamWriter 序列化和反序列化_第6张图片

五、StreamReader与StreamWriter:操作字符

一、StreamReader读取文件 
第1步:调用构造函数创建一个实例对象 
构造函数:StreamReader(String path, Encoding)

第2步:调用构造函数的一个读取方法Readline

using (StreamReader sr = new StreamReader("StreamWriter.txt", Encoding.Default))

{

    string str = null;//先声明一个字符串

    while ((str = sr.ReadLine()) != null)//判断读取到的字符串是为null,如果为null,说明已经读取到文件末尾

         {

         Console.WriteLine(str);//将读取到的字符串打印到控制台

         }

         Console.ReadKey();

}

            #region StreamWriter写入文件
            using (StreamWriter sWriter = new StreamWriter(@"E:\11.txt", true, Encoding.Default))
            {
                Console.WriteLine("请输入文本:");//提示用户输入字符串
                string strWrite = Console.ReadLine();//将用户输入的字符串赋值给strWrite
                sWriter.WriteLine(strWrite);//将字符串写入到文本中
                Console.WriteLine("写入成功");
            }
            #endregion

二、StreamWriter写入文件 
第1步:调用构造函数创建一个实例对象 
构造函数:StreamWriter(String path, bool append, Encoding) 
参数: 
path:要写入文件的路径 
append: true 若要将数据追加到该文件; false 覆盖该文件。 如果指定的文件不存在,该参数无效,且构造函数将创建一个新文件。

第2步:调用构造函数的一个写入方法WriteLine

using (StreamWriter sw = new StreamWriter("StreamWriter.txt", true, Encoding.Default))

{

     Console.WriteLine("请输入文本:");//提示用户输入字符串

     string str = Console.ReadLine();//将用户输入的字符串赋值给str

     sw.WriteLine(str);//将字符串写入到文本中

}

            #region StreamReader读取文件
            using (StreamReader sr = new StreamReader(@"E:\1.txt", Encoding.Default))
            {
                while (!sr.EndOfStream)
                {
                    Console.WriteLine(sr.ReadLine());
                }
                //string strStream = null;//先声明一个字符串
                //while ((strStream = sr.ReadLine()) != null)//判断读取到的字符串是为null,如果为null,说明已经读取到文件末尾
                
                //{
                //    Console.WriteLine(strStream);//将读取到的字符串打印到控制台
                //}
            }

            #endregion

1、StreamWriter(“路径”,“是否追加到现有文件”);

C#基础知识及题目练习 Day8 文件操作 FileStream StreamWriter 序列化和反序列化_第7张图片

六、序列化和反序列化

1、序列化:将对象转换为二进制

     反序列化:将二进制转换为对象

作用:传输数据

2、序列化步骤

1)标记[Serialize]

2)BinaryFormatter进行序列化或反序列化

Deserialize(Stream)  将指定的流反序列化成对象

Serialize(Stream, Object) 将对象序列化到给定的流

 

            #region 用BinaryFormatter进行序列化或反序列化
            Person p = new Person();
            p.Sex = 1;
            p.Age = 21;
            p.Name = "张三";

            using (FileStream swBF = new FileStream(@"E:\11.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                BinaryFormatter bfs = new BinaryFormatter();
                bfs.Serialize(swBF, p);
                //Serialize(Stream, Object) 将对象序列化到给定的流
                swBF.Close();
            }
            using (FileStream srBF = new FileStream(@"E:\11.txt", FileMode.OpenOrCreate, FileAccess.Read))
            {
                BinaryFormatter bfs = new BinaryFormatter();//?? 定义了一个类对象
                Person p2 = (Person)bfs.Deserialize(srBF);
                //Deserialize(Stream)  将指定的流反序列化成对象
                Console.WriteLine(p2.Sex);
                Console.WriteLine(p2.Name);
                Console.WriteLine(p2.Age);
            }
            Console.ReadKey();
            #endregion

 

拓:

序列化是把一个内存中的对象的信息转化成一个可以持久化保存的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,常用的有序列化有jsonxml、文件等.

一、序列化为json

Json【javascript对象表示方法】,它是一个轻量级的数据交换格式,我们可以很简单的来读取和写它,并且它很容易被计算机转化和生成,它是完全独立于语言的。

C#中用于对象和json相互转换的原生类有两个:DataContractJsonSerializerJavaScriptSerializer,其中JavaScriptSerializer主要用于web的浏览器和服务器之间的通信。

将一个json格式的字符串反序列化为对象是用DataContractJsonSerializer实例的ReadObject()方法

二、序列化为xml

C#中将对象序列化和反序列化为xml的类是XmlSerializer。将xml文件反序列化的方法是用XmlSerializer实例的Deserialize()方法

三、序列化为文件

C#中将对象序列化和反序列化为二进制文件的类是BinaryFormatter。通过BinaryFormatter类型实例的Deserialize()方法把二进制文本反序列化为对象

你可能感兴趣的:(C#)